Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Loops Prolog中的重复解_Loops_Prolog_Duplicates_Infinite_Repeat - Fatal编程技术网

Loops Prolog中的重复解

Loops Prolog中的重复解,loops,prolog,duplicates,infinite,repeat,Loops,Prolog,Duplicates,Infinite,Repeat,我有一段代码是这样的 call(Person, Someone) :- canCall(Person, Someone, []). canCall(Person, Someone, _) :- hasNumber(Person, Someone). canCall(Person, Someone, Contacted) :- personExists(SomeoneElse), \+ member(SomoneElse, Contacted), know

我有一段代码是这样的

call(Person, Someone) :-
    canCall(Person, Someone, []).

canCall(Person, Someone, _) :-
    hasNumber(Person, Someone).
canCall(Person, Someone, Contacted) :-
    personExists(SomeoneElse),
    \+ member(SomoneElse, Contacted),
    knows(SomeoneElse, Someone),
    canCall(Person, SomeoneElse, [Someone | Contacted]).
(knows会检查他们是否住在一起、是否一起工作等。它肯定会返回正确的结果并终止。)

当我运行这个查询时,代码只给出了默认的解决方案(对于第一个子句)和第二个子句的一个重复的解决方案

?- call(david, Someone).
并寻找所有替代解决方案。它不仅仅是给出重复的解决方案。事实上,我不介意我有重复的解决方案。它只是重复输出一个答案


即使在执行跟踪之后,我也不确定问题出在哪里。

我不知道原因,但是

call(Person, Someone) :-
    canCall(Person, Someone, []).

canCall(Person, Someone, _) :-
    hasNumber(Person, Someone).
canCall(Person, Someone, Contacted) :-
    personExists(SomeoneElse),
    \+ member(SomoneElse, Contacted),
    canCall(Person, SomeoneElse, [Someone | Contacted]),
    knows(SomeoneElse, Someone).

成功了。这不是我的原始代码,因此可能还有其他一些潜在原因(这个示例实际上在没有更改的情况下工作)。

我不知道为什么,但是

call(Person, Someone) :-
    canCall(Person, Someone, []).

canCall(Person, Someone, _) :-
    hasNumber(Person, Someone).
canCall(Person, Someone, Contacted) :-
    personExists(SomeoneElse),
    \+ member(SomoneElse, Contacted),
    canCall(Person, SomeoneElse, [Someone | Contacted]),
    knows(SomeoneElse, Someone).

成功了。这不是我的原始代码,因此可能还有其他一些潜在原因(该示例实际上在没有更改的情况下有效)。

如果两个人可以通过多种方式相互了解,一个人可以通过多种方式呼叫其他人,那么一个人可以通过多种方式呼叫其他人。您是否可以添加一些示例事实和输出?另外,您在
\+成员(其他人,已联系)中有输入错误,
;您想要“someonether”您可能希望避免使用诸如
call
这样的通用名称定义谓词,因为
call
已经是预定义的Prolog谓词。为什么
personExists(someonether)
?这绝对是多余的。如果两个人可以通过多种方式相互认识,一个人可以通过多种方式打电话给其他人,那么一个人可以通过多种方式打电话给其他人。您可以添加一些示例事实和输出吗?另外,您在
\+成员(SomoneElse,Contacted)中确实有输入错误,
;您想要“someonether”您可能希望避免使用诸如
call
这样的通用名称定义谓词,因为
call
已经是预定义的Prolog谓词。为什么
personExists(someonether)
?这绝对是多余的。@repeat:好吧,既然它终止并找到了所有正确的答案,我假设它有效…@repeat:好吧,既然它终止并找到了所有正确的答案,我假设它有效。。。