我怎样才能在Prolog的家谱中提问?

时间:2014-03-04 16:47:38

标签: prolog

我目前正在尝试学习如何使用Prolog。我安装了SWI-Prolog version 6.2.6

似乎运行:

?- 3<4.
true.

?- 4<3.
false.

作为第一个例子,我试图实现询问有关家谱的问题。所以我从头开始,存储在family.pl

father(bob,danna).
father(bob,fabienne).
father(bob,gabrielle).
mother(alice,danna).
mother(alice,fabienne).
mother(alice,gabrielle).
father(charlie,ida).
father(charlie,jake).
mother(danna,ida).
mother(danna,jake).
father(edgar,kahlan).
mother(fabienne,kahlan).
father(hager,luci).
mother(gabrielle,luci).
male(X) :- father(X,_).
female(X) :- mother(X,_).

但是当我尝试用consult(family).加载时,我得到:

?- consult(family).
Warning: /home/moose/Desktop/family.pl:7:
    Clauses of father/2 are not together in the source-file
Warning: /home/moose/Desktop/family.pl:9:
    Clauses of mother/2 are not together in the source-file
Warning: /home/moose/Desktop/family.pl:11:
    Clauses of father/2 are not together in the source-file
Warning: /home/moose/Desktop/family.pl:12:
    Clauses of mother/2 are not together in the source-file
Warning: /home/moose/Desktop/family.pl:13:
    Clauses of father/2 are not together in the source-file
Warning: /home/moose/Desktop/family.pl:14:
    Clauses of mother/2 are not together in the source-file
% family compiled 0.00 sec, 17 clauses
true.

我不明白这里有什么问题。我发现一些结果提到-无法在标识符中使用,但我没有在标识符中使用-

问题1 :是什么原因造成上述警告?我该如何解决?

但是只有警告,所以我继续

?- female(fabienne).
true.

?- male(fabienne).
false.

好的,这似乎按预期工作。

然后我添加了

male(jake).
female(ida).
female(kahlan).
female(luci).
brother(X,Y):-
    male(X),
    (mother(Z,X)=mother(Z,Y);father(Z,X)=father(Z,Y)).

并尝试:

?- brother(jake,ida).
false.

为什么不是这样?

问题2:我的brother规则有什么问题?

2 个答案:

答案 0 :(得分:2)

您的第一个问题已经回答here

至于第二种,你是在考虑功能而不是关系。

mother(Z,X) = mother(Z,Y)

与说X = Y相同,因为它比较了两个术语,而没有解释它们。如果您希望Z成为XY的母亲,则需要合作:

mother(Z, X), mother(Z, Y)

答案 1 :(得分:0)

如果你将所有父亲和母亲的声明一起移动(不要混合它们),可以修复warrning 在兄弟定义中你使用=并且你应该使用逻辑AND所以使用,(逗号) 你也需要告诉prolog杰克是男性,因为他无法从这些规则中弄明白

我将兄弟定义分成2,因为更清楚,这就像逻辑OR(第一个定义有效或第二个定义)

father(bob,danna).
father(bob,fabienne).
father(bob,gabrielle).
father(charlie,ida).
father(charlie,jake).
father(edgar,kahlan).
father(hager,luci).

mother(alice,danna).
mother(alice,fabienne).
mother(alice,gabrielle).

mother(danna,ida).
mother(danna,jake).
mother(fabienne,kahlan).
mother(gabrielle,luci).
male(jake).
male(X) :- father(X,_).
female(X) :- mother(X,_).

brother(X,Y):-
    male(X),
    mother(Z,X),mother(Z,Y).
brother(X,Y):-
    male(X),    
    father(Z,X),father(Z,Y).

用于试运行

brother(X,Y).

要获得更多结果,你需要添加谁是男性opr女性为那些孩子,就像我为杰克做的那样