【发布时间】:2018-05-09 03:36:25
【问题描述】:
为序言考试进行复习,并研究我们没有答案的过去试卷,我在一个问题中遇到了一半,我真的希望能得到一些帮助!
问题:
写一个谓词permute(Xs, Ys),对列表Xs的元素进行打乱,得到打乱的列表Ys。
查询?- permute([1,2,3], Ys). 应该成功六次并给出以下答案:
Ys = [1,2,3]
Ys = [2,1,3]
Ys = [2,3,1]
Ys = [1,3,2]
Ys = [3,1,2]
Ys = [3,2,1]
虽然不一定按这个顺序。
建议我们使用我们已经创建的谓词,到目前为止我有这个:
insert([], Y, [Y]).
insert([H|T], Y, [Y, H|T]).
insert([H|T], Y, [H|T2]) :- insert(T, Y, T2).
permute([], []).
permute([H|T], X) :- insert(T, H, X).
当我查询它时,我只得到了我应该得到的一半,而且我无法切换列表的顺序。
?- permute([1,2,3], Ys).
Ys = [1,2,3],
Ys = [2,1,3],
Ys = [2,3,1].
非常感谢任何建议!
【问题讨论】:
-
您可能会发现this answer 很有用。
-
@DanielLyons 谢谢你帮助了一些人,如果我在答案中运行 perm([1,2,3], P) 的代码,它可以工作,但我真的很难“翻译”(因为想要一个更好的词)将 select/3 谓词转换为我必须使用的 insert/3 谓词
-
不要将谓词视为函数。谓词定义参数之间的关系。所以
insert/3和select/3完全等价,只是重新排列了参数。 -
@lurker 真的很抱歉,如果我很迟钝,但如果
perm(List, [First|Perm]) :- select(First, List, Rest), perm(Rest, Perm).中的select/3与我的insert/3相同,我就是无法弄清楚递归调用会发生什么是。我已经正确地重新排列和匹配参数并且失败了 -
您是否独立于
permute/2独立测试了insert/3谓词?如果是这样,它是否正常工作?我的另一条评论是:insert(ListWithoutX, X, ListWithX)与select(X, ListWithX, ListWithoutX)相同(在 Prolog 库中定义)。如果实施得当,它们的行为应该是相同的。
标签: prolog