1

一个(非常)奇怪的故事:我娶了一个寡妇(W),她有一个女儿(D)。我的父亲(F)娶了我的继女(D)。我的妻子生了一个儿子(s1)。我父亲的妻子(继女)也有一个儿子(s2)。

该项目的目标是输入:

grandfather(i,i).

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 很陌生。

4

2 回答 2

1

谓词应该是

f_in_law(X,Y) :- husband(Y,Z),father(X,Z).

代替

f_in_law(X,Y) :- husband(Z,Y),father(X,Z).
于 2013-02-25T09:24:09.680 回答
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.
于 2013-02-25T11:02:39.487 回答