prolog var exchange

时间:2012-03-09 17:25:48

标签: prolog

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

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

如何在不使用列表的情况下在prolog中对此进行编码?

提前致谢

3 个答案:

答案 0 :(得分:2)

这个概念在Prolog中并不存在。一旦变量绑定到某个值,它就不再是变量。它变成了它所绑定的那个。

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

要做你想做的事,你需要做类似的事情:

交换(a(C,Y,V),a(Y,C,V))。

您可能想要获取一些参考资料:

  • Programming In Prolog。 William Clocksin和Christopher Mellish。可以说是Prolog的最佳介绍性文本。
  • The Art of Prolog。 Leon Sterling和Ehud Shapiro。就个人而言,我发现这比Clocksin和Mellish更有用。

Cover: The Art of Prolog Cover: Programming in Prolog

这些书看起来很有趣,虽然我没有亲身经历过这些书:

Cover: The Craft of Prolog Cover: Clause and Effect

答案 1 :(得分:1)

在(非回溯)Prolog中,您在纯函数范式中工作:您的状态不是隐含在变量的值中,而是隐含在变量的名称中。这意味着你没有状态的隐含变化,而是状态的明确进展。即,

swap([Y2,C2],[Y,C]) :- [C2,Y2] = [Y,C].

你称之为

swap([Y2,C2], [Y,C]).

并在之前使用Y2,C2的任何地方使用Y,C。它,你有两个版本,先前和当前,但从现在开始只使用后者。我知道你说“没有名单”,但这只是一个句法细节,为了放松眼睛/手指(你也可以在那里使用圆括号)。

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

[C2,Y2] = [Y,C],  .... 

具有相同的效果(您不需要第三个var来交换值,就像在命令式设置中那样)。

另外,我衷心地推荐伊万·布拉特科(Ivan Bratko)以及“Prolog的艺术”(The Art of Prolog)这本非常清晰和清晰的书。 “Craft”非常多样化和“Clause”侧重于几个例子,两者都可能更好地作为二级阅读。

Cover: Prolog Programming for Artificial Intelligence http://ecx.images-amazon.com/images/I/41VSbrQBSxL._SS500_.jpg

答案 2 :(得分:0)

只是一个想法:如果你将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 

...请注意,这将继续回溯,为您提供备用绑定, ad infinitum ,这不是很有用。但是,如果您的程序只需要使用此程序测试特定'A'/3事实的存在,您仍然可以使用once('A'(X,Y,Z))(如果您的Prolog具有内置once/1),只要在递归定义之前声明'A'(X,Y,Z), !的一个或多个事实,就可以满足复合子目标'A'/3

我不建议在真正的Prolog程序中实际执行任何此操作; - )