Parent-query 在序言中不 return 所有父母身份
Parent-query in prolog does not return ALL parentships
鉴于这些事实:
male(jerry).
male(stuart).
male(warren).
male(peter).
female(kather).
female(maryalice).
female(ann).
brother(jerry,stuart).
brother(jerry,kather).
brother(peter, warren).
sister(ann, maryalice).
sister(kather,jerry).
parent_of(warren,jerry).
parent_of(maryalice,jerry).
如您所见,warren 和 maryalice 是 parents 的 jerry、stuart 和 kather。我需要实施什么规则才能查询 parent_of(X,Y).
到 return
X=warren, Y=jerry
X=warren, Y=stuart
X=warren, Y=kather
X=maryalice, Y=jerry
X=maryalice, Y=stuart
X=maryalice, Y=kather
即所有的亲子关系?
我试过了
parent_of(X,Y) :- parent_of(X,C), sibling(Y,C), X \= Y.
sibling(C,OC) :- brother(C,OC), C \= OC.
sibling(C,OC) :- sister(C,OC), C \= OC.
但是查询 parent_of(X,Y).
return 这个
X = warren,
Y = jerry ;
X = maryalice,
Y = jerry ;
X = warren,
Y = kather ;
X = maryalice,
Y = kather ;
X = warren,
Y = jerry ;
X = maryalice,
Y = jerry ;
X = warren,
Y = kather ;
X = maryalice,
Y = kather ;
X = warren,
Y = jerry ;
X = maryalice,
Y = jerry ;
X = warren,
Y = kather ;
X = maryalice,
Y = kather ;
X = warren,
Y = jerry ;
X = maryalice,
Y = jerry ;
X = warren,
Y = kather ;
........
warren 和 stuart 以及 maryalice 和 stuart 之间的亲子关系是错误的(而且它也陷入了某种循环!)。
请帮帮我!
我会将事实 parent_of
与谓词分开:
is_parent_of(X, Y) :- parent_of(X, Y).
is_parent_of(X, Y) :- parent_of(X, C), sibling(C, Y).
我认为您在这里不需要 C \= Y
,因为您的事实没有任何人是他们自己的兄弟姐妹,所以检查是多余的。同样,检查以确保我们没有捕捉到某人是他们自己的人是多余的 parent。
使用上述规则和您当前的数据库示例,您将获得想要的结果:
| ?- is_parent_of(X, Y).
X = warren
Y = jerry ? ;
X = maryalice
Y = jerry ? ;
X = warren
Y = stuart ? ;
X = warren
Y = kather ? ;
X = maryalice
Y = stuart ? ;
X = maryalice
Y = kather ? ;
(1 ms) no
| ?-
鉴于这些事实:
male(jerry).
male(stuart).
male(warren).
male(peter).
female(kather).
female(maryalice).
female(ann).
brother(jerry,stuart).
brother(jerry,kather).
brother(peter, warren).
sister(ann, maryalice).
sister(kather,jerry).
parent_of(warren,jerry).
parent_of(maryalice,jerry).
如您所见,warren 和 maryalice 是 parents 的 jerry、stuart 和 kather。我需要实施什么规则才能查询 parent_of(X,Y).
到 return
X=warren, Y=jerry
X=warren, Y=stuart
X=warren, Y=kather
X=maryalice, Y=jerry
X=maryalice, Y=stuart
X=maryalice, Y=kather
即所有的亲子关系?
我试过了
parent_of(X,Y) :- parent_of(X,C), sibling(Y,C), X \= Y.
sibling(C,OC) :- brother(C,OC), C \= OC.
sibling(C,OC) :- sister(C,OC), C \= OC.
但是查询 parent_of(X,Y).
return 这个
X = warren,
Y = jerry ;
X = maryalice,
Y = jerry ;
X = warren,
Y = kather ;
X = maryalice,
Y = kather ;
X = warren,
Y = jerry ;
X = maryalice,
Y = jerry ;
X = warren,
Y = kather ;
X = maryalice,
Y = kather ;
X = warren,
Y = jerry ;
X = maryalice,
Y = jerry ;
X = warren,
Y = kather ;
X = maryalice,
Y = kather ;
X = warren,
Y = jerry ;
X = maryalice,
Y = jerry ;
X = warren,
Y = kather ;
........
warren 和 stuart 以及 maryalice 和 stuart 之间的亲子关系是错误的(而且它也陷入了某种循环!)。
请帮帮我!
我会将事实 parent_of
与谓词分开:
is_parent_of(X, Y) :- parent_of(X, Y).
is_parent_of(X, Y) :- parent_of(X, C), sibling(C, Y).
我认为您在这里不需要 C \= Y
,因为您的事实没有任何人是他们自己的兄弟姐妹,所以检查是多余的。同样,检查以确保我们没有捕捉到某人是他们自己的人是多余的 parent。
使用上述规则和您当前的数据库示例,您将获得想要的结果:
| ?- is_parent_of(X, Y).
X = warren
Y = jerry ? ;
X = maryalice
Y = jerry ? ;
X = warren
Y = stuart ? ;
X = warren
Y = kather ? ;
X = maryalice
Y = stuart ? ;
X = maryalice
Y = kather ? ;
(1 ms) no
| ?-