Prolog 序言:寻找家庭中的表亲

Prolog 序言:寻找家庭中的表亲,prolog,Prolog,试着做一个开场白问题来找到第一个表亲 /* first person is parent of second person */ parent(a, b). parent(b, f). parent(a, d). parent(f, g). parent(a, k). parent(f, h). parent(k, l). parent(f, i). parent(k, m). parent(l, t). parent(b, e). sibling(X,Y) :- parent(Z,X), p

试着做一个开场白问题来找到第一个表亲

/* first person is parent of second person */
parent(a, b).
parent(b, f).
parent(a, d).
parent(f, g).
parent(a, k).
parent(f, h).
parent(k, l).
parent(f, i).
parent(k, m).
parent(l, t).
parent(b, e).

sibling(X,Y) :- parent(Z,X), parent(Z,Y), not(X=Y).

grandparent(X, Z) :-
    parent(X, Y),
    parent(Y, Z).

cousin1(Child1,Child2) :-
    grandparent(Y1,Child1),
    grandparent(Y2,Child2),
    not(sibling(Child1,Child2)),
    Y1=Y2 .
似乎有效,但如果输入的是同一个子项,是否有方法阻止它返回true

编辑:最终答案

cousin1(Child1,Child2) :-
    parent(Y1,Child1),
    parent(Y2,Child2),
    sibling(Y1,Y2).

编写一个.not self谓词,如果子级相等,则返回false。把它加到你的表亲谓词中。

最后的答案

 cousin1(Child1,Child2) :-
     parent(Y1,Child1),
     parent(Y2,Child2),
     sibling(Y1,Y2).

提示1:将“cousin1”中的条件“祖父母(Y2,Child2)”更改为“祖父母(Y1,Child2)”,并删除Y1=Y2。性能提高。hint2:定义“cousin1”时只使用“父母”和“兄弟姐妹”。hint1大大简化了它,不知道为什么我总是把事情复杂化。不知道该怎么做2?如果父母是兄弟姐妹,两个人是表亲。这又是我把事情复杂化的一个例子。谢谢