Prolog排列 - 代码略显不清楚

时间:2017-02-18 13:52:52

标签: prolog permutation

我对我刚刚撰写的以下代码提出了一些疑问。

permu([],[]).
permu([H|T],R) :- same_length([H|T],R), select(H,R,Rz), permu(T,Rz).

结果:给出所有排列(不会删除冗余,但事实并非如此;通过使用findall并定义另一个谓词,我可以解决这个问题容易)

我的初始代码:

permu([],[]).
permu([H|T],R) :- select(H,R,Rz), permu(T,Rz).

结果:在点击"下一步"时,给出第一个结果并以无限循环结束。但是当我决定精确定义它们的长度时(如上所示same_length)它突然起作用了。

我已经跟踪了这两个代码,但我仍然不明白为什么在任何情况下都要定义两个列表的长度。 查看我的初始代码,两个列表在递归的每个步骤中都会丢失一个元素。由于R,左侧的列表在每次运行时都被截断,我的select变量正在缩短。递归过程结束,当两个列表用完同一递归中的元素时运行=>由于select,两个列表都需要共享相同数量和类型的元素。

什么阻止Prolog实现它?是什么让他陷入了无尽的循环?

以此代码为例,我不必定义长度但它仍然有效:

permu([], []).
permu([H|T], R) :- permu(T, Rz), select(H, R, Rz).

与我的初始代码相比,select只是在递归调用(permu)之后放置。

0 个答案:

没有答案