这是我的第一个想法:
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/