在某些编程语言中,要更改变量的位置,可以执行以下操作:
A(C,Y,V):= A(Y,C,V)
如何在不使用列表的情况下在prolog中对此进行编码?
提前致谢
答案 0 :(得分:2)
这个概念在Prolog中并不存在。一旦变量绑定到某个值,它就不再是变量。它变成了它所绑定的那个。
这就是为什么它被称为 统一 。
要做你想做的事,你需要做类似的事情:
交换(a(C,Y,V),a(Y,C,V))。
您可能想要获取一些参考资料:
这些书看起来很有趣,虽然我没有亲身经历过这些书:
答案 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”侧重于几个例子,两者都可能更好地作为二级阅读。
答案 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程序中实际执行任何此操作; - )