【问题标题】:Prolog recursive list shufflingProlog递归列表改组
【发布时间】: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/3select/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


【解决方案1】:

只是为了好玩,这里有一个完全基于append/3的解决方案:

permute(XX, [B|YY]) :-
    append(AA,[B|CC],XX),  % remove random element B from XX
    append(AA,CC,DD),      % DD is XX without B
    permute(DD,YY).        % permute DD into YY
permute([],[]).

简单易懂,但可能比已经建议的传统实现效率低(尽管操作原理完全相同;请阅读 cmets)。

【讨论】:

  • 谢谢你,我曾经跟踪过它以尝试理解它,只是觉得我错过了一些真正关键的东西,我需要对我的插入或置换谓词做一些事情让它做我想做的事。我似乎有点绕圈子
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多