小编qua*_*ret的帖子

Prolog - 查找列表中的相邻元素

我正在尝试定义一个谓词adjacent(X, Y, Zs),如果X和Y在列表中相邻,则该谓词为真.我的代码目前是这样的:

adjacent(_, _, []).
adjacent(X, Y, [X, Y|Tail]) :-
  adjacent(X,Y, Tail).
Run Code Online (Sandbox Code Playgroud)

它适用于基本情况adjacent(c, d, [a, b, c, d, e]),但由于基本情况,每个其他情况也返回true,我坚持这一点.

另一个问题是,如果X不等于列表头部的第一部分,那么它会跳过X和Y并转到下一个'X'; 例如,如果c不等于a,则它跳过ab两者并检查c是否等于c.例如,当列表是这时,这是有问题的

[a, c, d, e]
Run Code Online (Sandbox Code Playgroud)

因为它最终永远不会检查c(我相信).

我很遗憾如何协调这两个问题,并将我对逻辑的理解转化为代码需要发生的事情.

编辑:感谢Christian Hujer的回答,我的基本情况错误已得到纠正,所以现在我只是坚持第二个问题.

recursion traversal list prolog

22
推荐指数
4
解决办法
3080
查看次数

在查阅文件时,参数没有充分实例化

我通过终端在Mac上运行SWI-Prolog.我正在尝试通过在终端中打开swipl之后编写通常来访问Atom文件:

?- [hwk1-my_name].
Run Code Online (Sandbox Code Playgroud)

而不是swipl有知识库可以玩,它给了我这个:

ERROR: Arguments are not sufficiently instantiated
Run Code Online (Sandbox Code Playgroud)

我是Prolog的新手,我现在的程序只是我教授提供的复制粘贴代码,以便开始分配.这是否意味着错误可能是由于下面的代码中的某些内容,如果是这样,是什么促使这个?这是提供给我的代码:

father(Dad, Child) :-
   parent(Dad, Child),
   male(Dad).

mother(Mom, Child) :-
   parent(Mom, Child),
   female(Mom).

had_a_child(Man, Woman) :-
   father(Man, Child),
   mother(Woman, Child).

sibling(Sibling1, Sibling2) :-
   parent(Parent, Sibling1),
   parent(Parent, Sibling2),
   Sibling1 \= Sibling2.

brother(Brother, Sib) :-
   sibling(Brother, Sib),
   male(Brother).

sister(Sister, Sib) :-
   sibling(Sister, Sib),
   female(Sister).
Run Code Online (Sandbox Code Playgroud)

prolog instantiation-error

3
推荐指数
1
解决办法
439
查看次数

标签 统计

prolog ×2

instantiation-error ×1

list ×1

recursion ×1

traversal ×1