我对我刚刚撰写的以下代码提出了一些疑问。
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
)之后放置。