以下故事来自 N. Wirth (1976) 的算法 + 数据结构 = 程序。
我嫁给了一个寡妇(我们称她为 W),她有一个成年女儿(称她为 D)。我的父亲(F)经常来看我们,他爱上了我的继女并娶了她。于是,父亲成了我的女婿,继女成了我的母亲。几个月后,我妻子生了一个儿子(S1),他成为我父亲和叔叔的姐夫。我父亲的这个妻子,也就是我的继女,也有一个儿子(S2)。
我正在尝试在 prolog 中对这些关系进行建模,因此最终我可以输入:
| ?- grandfather(i,i).
对于我是否是我自己的爷爷,我会得到“是”或“否”。
这是我到目前为止编写的代码(grandpa.pl):
aunt(X,Y):-
sibling(X,Z),
parent(Z,Y),
female(X).
brother(X,Y):-
sibling(X,Y),
male(X).
brother_in_law(X,Y):-
child(X,Z),
married(Z,W),
parent(W,Y),
not(sibling(X,Y)),
male(X).
brother_in_law(s1,f).
child(X,Y):-
parent(Y,X).
daughter(X,Y):-
parent(Y,X),
child(X,Y),
female(X).
daughter(d,w).
father(X,Y):-
parent(X,Y),
male(X).
father(f,i).
father_in_law(X,Y):-
child(X,Z),
married(Y,Z),
not(child(X,Y)),
male(X).
grandparent(X,Y):-
parent(X,Z),
parent(Z,Y).
grandmother(X,Y):-
grandparent(X,Y),
female(X).
grandfather(X,Y):-
grandparent(X,Y),
male(X).
grandchild(X,Y):-
child(X,Z),
child(Z,Y).
married(X,Y):-
wife(X,Y),
female(X).
married(X,Y):-
husband(X,Y),
male(X).
married(i,w).
married(f,d).
mother(X,Y):-
parent(X,Y),
female(X).
parent(X,Y):-
child(Y,X).
sibling(X,Y):-
parent(Z,X),
parent(Z,Y).
sister(X,Y):-
sibling(X,Y),
female(X).
son(X,Y):-
parent(Y,X),
male(X).
son(s1,w).
son(s2,d).
son_in_law(X,Y):-
child(X,Z),
not(child(X,Y)),
married(Z,Y),
male(X).
son_in_law(f,i).
step_daughter(X,Y):-
child(X,Z),
married(Z,Y),
not(child(X,Y)),
female(X).
step_daughter(d,i).
step_parent(X,Y):-
married(X,Z),
parent(Z,Y),
not(parent(X,Y)).
step_father(X,Y):-
step_parent(X,Y),
male(X).
step_mother(X,Y):-
step_parent(X,Y),
female(X).
step_mother(d,i).
uncle(X,Y):-
sibling(X,Z),
parent(Z,Y),
male(X).
uncle(s1,i).
现在我在循环定义方面遇到了很多麻烦,所以在运行查询时我会陷入无限循环:祖父(i,i)。
例如,我有:
(1 毫秒) 是 {trace} | ?-祖父(i,i)。1 1 呼叫:祖父(i,i) ?
2 2 呼叫:祖父母(i,i)?
3 3 呼叫:父母(i,_103)?
4 4 呼叫:child(_127,i) ?
5 5 呼叫:父母(i,_151)?
6 6 调用:child(_175,i) ?
7 7 呼叫:父母(i,_199)?
8 8 调用:child(_223,i) ?
9 9 呼叫:父母(i,_247)?
10 10 调用:child(_271,i) ?
11 11 呼叫:父母(i,_295)?
12 12 呼叫:孩子(_319,i)?
13 13 呼叫:父母(i,_343)?
14 14 呼叫:child(_367,i) ?
15 15 呼叫:父母(i,_391)?
...
这是因为 child 将自己定义为有一个 parent,而 parent 定义自己有一个 child(正如您将在我发布的上述谓词中看到的那样)。
谁能帮我重新定义这些关系的谓词,以便我可以确定我是否是我自己的爷爷?