这是我的第一个想法:

perm([X|Y],Z) :- takeout(X,Z,W), perm(Y, W).
perm([],[]).

当我尝试运行 -? perm([1, 2, 3], P). 时,它​​显示了堆栈溢出问题。

但是如果我们改变两个语句的顺序,它就会起作用。
perm([X|Y],Z) :- perm(Y, W), takeout(X,Z,W).
perm([],[]).

为什么?我是Prolog初学者,请帮助。

最佳答案

你所指的takeout/3就是俗称的select(X, Xs0, Xs)
这是另一个定义 - 说明 DCG 的不常见用法。

perm(Xs,Ys) :-
   phrase(perm(Xs),[],Ys).

perm([]) --> [].
perm([X|Xs]) --> perm(Xs), ins(X).

ins(X),[X] --> [].
ins(X),[Y] --> [Y], ins(X).

关于list - 为什么改变事实的顺序会改变谓词的行为?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8071018/

10-11 05:57