Prolog家谱

Prolog家谱,prolog,Prolog,我正试着用Prolog写一个家谱程序作为我的家庭作业。这是代码的一部分 /** a sample fact **/ parents(someone, someoneelse, child). /** are M and F parents of the children in the given list? **/ parents(M,F,[]) :- parents(M,F,_). parents(M,F,[First|Rest]) :- parents(M,F,First), parent

我正试着用Prolog写一个家谱程序作为我的家庭作业。这是代码的一部分

/** a sample fact **/
parents(someone, someoneelse, child).

/** are M and F parents of the children in the given list? **/
parents(M,F,[]) :- parents(M,F,_).
parents(M,F,[First|Rest]) :- parents(M,F,First), parents(M,F,Rest).

/** are M and F parents? **/
parents(M,F) :- parents(M,F,_).
当我使用一个符合事实的查询时,上面的代码是有效的

   [trace] 25 ?- parents(someone,someoneelse).
       Call: (6) parents(someone, someoneelse) ? creep
       Call: (7) parents(someone, someoneelse, _G586) ? creep
       Exit: (7) parents(someone, someoneelse, child) ? creep
       Exit: (6) parents(someone, someoneelse) ? creep
    true 
    .
但当我尝试这个:

[trace] 26 ?- parents(aa, bb).
   Call: (6) parents(aa, bb) ? creep
   Call: (7) parents(aa, bb, _G541) ? creep
   Call: (8) parents(aa, bb, _G541) ? creep
   Call: (9) parents(aa, bb, _G541) ? creep
   Call: (10) parents(aa, bb, _G541) ? 
...
它不工作,它进入一个无限循环。我做错了什么

编辑:我已将代码更改为:

/** a sample fact **/
parents(someone, someoneelse, child).

/** are M and F parents of the children in the given list? **/
parents(M,F,[]).
parents(M,F,[First|Rest]) :- parents(M,F,First), parents(M,F,Rest).

/** are M and F parents? **/
parents(M,F) :- parents(M,F,A), not(A=[]).
现在我得到的是:

[trace] 3 ?- parents(a,b).
   Call: (6) parents(a, b) ? creep
   Call: (7) parents(a, b, _G514) ? creep
   Exit: (7) parents(a, b, []) ? creep
^  Call: (7) not([]=[]) ? creep
^  Fail: (7) not(user: ([]=[])) ? creep
   Redo: (7) parents(a, b, _G514) ? creep
   Call: (8) parents(a, b, _G508) ? creep
   Exit: (8) parents(a, b, []) ? creep
   Call: (8) parents(a, b, _G509) ? creep
   Exit: (8) parents(a, b, []) ? creep
   Exit: (7) parents(a, b, [[]]) ? creep
^  Call: (7) not([[]]=[]) ? creep
^  Exit: (7) not(user: ([[]]=[])) ? creep
   Exit: (6) parents(a, b) ? creep
true 
.

我不明白为什么它现在失败后要重做。有什么想法吗?

你必须停止搜索。Prolog将检查所有规则并找到匹配项。如果匹配,则将进行扩展并重复该过程

第二行是inf循环的原因,因为上一条规则中的“不在乎”被映射到[]

如果要确定一对是否为任何子项的父项,只需删除中间的两条规则:


你必须停止搜索。Prolog将检查所有规则并找到匹配项。如果匹配,则将进行扩展并重复该过程

第二行是inf循环的原因,因为上一条规则中的“不在乎”被映射到[]

如果要确定一对是否为任何子项的父项,只需删除中间的两条规则:


我感觉你把两个不同的谓词混为一谈:

/** a sample fact **/
parents(someone, someoneelse, child).

/** are M and F parents of any child? **/
parents(M,F) :- parents(M,F,_).

/** are M and F parents of the children in the given list? **/
parents_of_all_children(M,F,[]).
parents_of_all_children(M,F,[First|Rest]) :-
    parents(M,F,First), parents_of_all_children(M,F,Rest).
那么,您的查询就有意义了:

?- parents(someone, someoneelse, C).
C = child.
%-- someone & someoneelse have child "child"

?- parents(A, B).
A = someone,
B = someoneelse.
%-- all possible parent pairs out there

?- parents(aa, bb).
false.
%-- do "aa" & "bb" form a parents pair?

我感觉你把两个不同的谓词混为一谈:

/** a sample fact **/
parents(someone, someoneelse, child).

/** are M and F parents of any child? **/
parents(M,F) :- parents(M,F,_).

/** are M and F parents of the children in the given list? **/
parents_of_all_children(M,F,[]).
parents_of_all_children(M,F,[First|Rest]) :-
    parents(M,F,First), parents_of_all_children(M,F,Rest).
那么,您的查询就有意义了:

?- parents(someone, someoneelse, C).
C = child.
%-- someone & someoneelse have child "child"

?- parents(A, B).
A = someone,
B = someoneelse.
%-- all possible parent pairs out there

?- parents(aa, bb).
false.
%-- do "aa" & "bb" form a parents pair?

不声明是什么意思?如果不声明事实,prolog就无法给出答案。好吧,这就是我从提供的信息中所能看出的。父母一个人,另一个人,孩子。这一行不是说明了事实吗?我编辑了我的答案,但我不确定这是否是必需的。我在帖子中解释道。展开parentstrash,第5行的垃圾变成parentstrash,垃圾,[],然后它穿过顶部,在第2行找到匹配项,这保持了相同的内容,然后它再次从顶部穿过,在第2行找到匹配项。。。这个过程变成了一个inf.循环。你不声明它是什么意思?如果你不声明事实,prolog就不能给出答案。好吧,这就是我从提供的信息中所能看出的。父母一个人,另一个人,孩子。这一行不是说明了事实吗?我编辑了我的答案,但我不确定这是否是必需的。我在帖子中解释道。展开parentstrash,第5行的垃圾变成parentstrash,垃圾,[],然后它穿过顶部,在第2行找到匹配项,这保持了相同的内容,然后它再次从顶部穿过,在第2行找到匹配项。。。该进程成为一个inf.循环。