一个(非常)奇怪的故事: 我娶了一个有女儿(W)的寡妇(W)。我的父亲(F)与我的继女(D)结婚。我的妻子生了一个儿子(s1)。我父亲的妻子(继女)也有一个儿子(s2)。
这个项目的目标是输入:
grandfather(i,i).
并在prolog中返回yes
。
这是我到目前为止所做的:
%facts
father(f,i).
husband(i,w).
husband(f,d).
mother(w,d).
mother(w,s1).
father(i,s1).
mother(d,s2).
father(f,s2).
%rules
father(X,Y) :- f_in_law(X,Y).
father(X,Y) :- husband(X,Z),mother(Z,Y).
f_in_law(X,Y) :- husband(Z,Y),father(X,Z).
b_in_law(X,Y) :- husband(Z,Y),brother(X,Z).
%brother(X,Y) :- b_in_law(X,Y).
uncle(X,Y) :- father(Z,Y),brother(X,Z).
grandfather(X,Y) :- father(Z,Y),father(X,Z).
我追查它,看看出了什么问题。 father(f,i)
是真的,所以这很好!但father(i,f)
被认为是错误的。有关如何纠正此问题的任何建议/想法?我很欣赏任何意见,因为我对prolog很新。
答案 0 :(得分:1)
谓词应该
f_in_law(X,Y) :- husband(Y,Z),father(X,Z).
而不是
f_in_law(X,Y) :- husband(Z,Y),father(X,Z).
答案 1 :(得分:0)
我已经重新制定了谜语
father(i, s1).
father(f, i).
father(f, s2).
fatlaw(X, Y) :- husband(X, Z), mother(Z, Y).
mother(w, d).
mother(w, s1).
mother(d, s2).
motlaw(X, Y) :- husband(Z, X), father(Z, Y).
husband(i, w).
husband(f, d).
grandfather(X, Y) :-
( father(X, Z) ; fatlaw(X, Z) )
, ( father(Z, Y) ; fatlaw(Z, Y) ; mother(Z, Y) ; motlaw(Z, Y) )
.
似乎是祖父必须接受虚假的生物后代(我希望这是合理的英语)。
用
?- grandfather(X,X).
X = i ;
false.