Prolog 序言变量交换

Prolog 序言变量交换,prolog,Prolog,在某些编程语言中,要更改变量的位置,可以执行以下操作: A(C,Y,V):=A(Y,C,V) 如何在prolog中编写此代码,而不使用列表 提前感谢这个概念在Prolog中并不存在。一旦一个变量绑定到一个值,它就不再是一个变量了。它变成了它被束缚的东西 这就是为什么它被称为统一 要想做你想做的事情,你需要做以下事情: 互换(a(C,Y,V),a(Y,C,V)) 您可能需要选择一些参考资料: 。威廉·克拉克辛和克里斯托弗·梅利什。可以说是Prolog最好的介绍性文本 。利昂·斯特林和埃胡德·夏皮

在某些编程语言中,要更改变量的位置,可以执行以下操作:

A(C,Y,V):=A(Y,C,V)

如何在prolog中编写此代码,而不使用列表


提前感谢

这个概念在Prolog中并不存在。一旦一个变量绑定到一个值,它就不再是一个变量了。它变成了它被束缚的东西

这就是为什么它被称为统一

要想做你想做的事情,你需要做以下事情:

互换(a(C,Y,V),a(Y,C,V))

您可能需要选择一些参考资料:

  • 。威廉·克拉克辛和克里斯托弗·梅利什。可以说是Prolog最好的介绍性文本
  • 。利昂·斯特林和埃胡德·夏皮罗。就我个人而言,我发现这比Clocksin和Mellish更有用

这些书看起来很有趣,尽管我没有亲身经历:

  • 。理查德·奥基夫
  • 。威廉·克拉克辛

只是一个想法:如果你把
a
当作一个Prolog谓词(如果你问如何在Prolog中实现这一点,我想你会这样做),那么肯定可以表达以下内容:

'A'(C, Y, V) :- 'A'(Y, C, V).
顺便说一下,这是实际的Prolog语法。它定义了一个谓词
'a'/3
,它颠倒了前两个参数的顺序。然而,在实践中,这样的谓词不会让Prolog程序走得太远,因为它会迫使
'a'/3
的解释进入无限循环

但是,如果您只是想让数据库包含
'A'/3
术语,这些术语反映了每个插入的匹配
'A'(Y,C,V)
的事实也与另一个匹配
'A'(C,Y,V)
的事实相关联(无论出于何种原因),那么它确实是可能的,如下所示:

'A'(c, y, v).
'A'(C, Y, V) :- 'A'(Y, C, V).
执行此命令将提供:

 ?- 'A'(X,Y,Z).
X = c,
Y = y,
Z = v ;
X = y,
Y = c,
Z = v 
…请注意,这将继续回溯,为您提供备用绑定,无限期,这不是很有用。但是,如果您的程序只需要在这个程序中测试特定的
'A'/3
事实的存在,您仍然可以使用
一次('A'(X,Y,Z))
(如果您的Prolog有内置的
一次/1
),或者复合子目标
'A'(X,Y,Z)'A'/3
的一个或多个事实,这就足够了

不过,我不建议在真正的Prolog程序中实际执行这些操作;-)

在(非回溯)序言中,您的工作方式与纯函数范式中的工作方式相同:您的状态在变量的值中不是隐式的,而是在变量的名称中是显式的。这意味着你的状态没有隐含的变化,而是一个显式的状态进展。即

swap([Y2,C2],[Y,C]) :- [C2,Y2] = [Y,C].
你把它叫做

swap([Y2,C2], [Y,C]).
并在您以前使用过Y、C的任何地方使用Y2、C2。因此,您有两个版本,前一个版本和当前版本,但从现在起只使用后一个版本。我知道你说“没有列表”,但这只是一个语法细节,以便于眼睛/手指(你也可以在那里使用圆括号,或与你选择的任何函子一起使用复合tern,无论是前缀还是中缀,例如
-

或者,您可以直接在代码中编写

[C2,Y2] = [Y,C],  .... 
为了获得相同的效果(您不需要第三个var通过它交换值,就像在命令式设置中那样)

此外,我衷心推荐伊万·布拉特科(Ivan Bratko)的一本非常清晰明了的书,以及序言的艺术。“工艺”是非常多样化的,“条款”集中在少数几个例子,两者都可能更好地作为二读

  • 。伊万·布拉特科

这不是序言,请解释更多…如果这个问题不是关于统一的,你的意图是把
A/3
当作谓词,那么请看我的帖子…非常感谢你的帖子。但是,有没有可能在没有函数的情况下实现呢?我正在寻找一个简单的替代。Prolog没有函数。或者替代。一旦某个对象被统一,它就是一个常量值,除非您回溯统一并撤销它。你真的需要仔细阅读序言。如果你不想看这本书,那就有一大堆序言教程。你需要学会用序言的方式思考。它明显不同于任何常见的、由Algol派生的过程语言—C,C++,COBOL,艾达,随便什么。如果你不想要这本书,网上有很多免费教程。我想“参考资料”应该是SWI Prolog、GNU Prolog等等。。文档以上只是有自己范围的“教科书”,大多数是产品中性的,这是好的。顺便说一句,还有一个ISO标准。