【问题标题】:Swi-Prolog Select List from List of Lists [duplicate]Swi-Prolog 从列表列表中选择列表 [重复]
【发布时间】:2018-05-05 11:10:11
【问题描述】:

您好,我正在做一个关于 prolog 的项目,但仍在掌握该语言。 我目前有一个列表列表,其中子列表有坐标。

我的目标是选择具有某个坐标 X 的子列表,然后将该列表从它的第一个元素剪切到 X。(只有一个列表)

我认为最初的问题是选择带有成员的子列表。所以我试着这样做。

sublist([],_, []).
sublist([H|R],Pos, [H|Aux]) :-
    member(Pos,H), !,
    sublist(R,Pos, Aux).
sublist([H|R],Pos, Aux) :-
    sublist(R,Pos,Aux).

这不起作用:

?- sublist([[(1,2),(1,3),(3,5)],[(1,5),(1,2)]], (1,5), X).
X = [].

我想要的第一阶段是这样的:

?- sublist([[(1,2),(1,3),(3,5)],[(1,5),(1,2)]], (1,5), X).
X = [(1,5),(1,2)].

(之后,当我选择了子列表后,我计划做类似的事情,将元素添加到空列表中,直到元素等于 X)。

所以最终的结果是:

?- sublist([[(1,2),(1,3),(3,5)],[(1,5),(1,2)]], (1,5), X).
X = [(1,5)].

我做错了什么?我还在学习用 Prolog 思考,所以我为明显的逻辑错误道歉。

【问题讨论】:

  • 相关(即相同的作业问题):stackoverflow.com/questions/50155722/…
  • 另外,我的 Prolog 会发出警告,包括:Clauses of sublist/3 are not together in the source-file ... Current predicate: sulist/3。你有一个错字需要改正。
  • 已修复!虽然错字不是问题的根源(我从我的代码翻译并错过了它)。检查您发送的链接,谢谢!
  • 发送的链接给了我完成这项工作的总体思路,感谢和抱歉重复!

标签: prolog


【解决方案1】:

如果我正确理解您的问题:

sublist(L, Elem, M) :-
    member(M, L),
    member(Elem, M).

L 包含一个列表M,其中包含和元素Elem

给出结果:

?- sublist([[(1,2),(1,3),(3,5)],[(1,5),(1,2)]], (1,5), X).
X = [(1, 5),  (1, 2)] ;
false.

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-01-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-17
    • 1970-01-01
    相关资源
    最近更新 更多