给定值x和y如果为真则返回规则名称

时间:2015-09-24 21:02:07

标签: prolog

这是我的prolog文件。

male(bob).
male(john).

female(betty).
female(dana).

father(bob, john).
father(bob, dana).
mother(betty, john).
mother(betty, dana).

husband(X, Y) :- male(X), mother(Y, Z), father(X, Z).
wife(X, Y) :- female(X), father(Y, Z), mother(X, Z).
son(X, Y) :- male(X), mother(Y, X);female(X), father(Y, X).
daughter(X, Y) :- female(X), mother(Y, X);female(X), father(Y, X).
sister(X, Y) :- female(X), mother(Z, X), mother(Z, Y), X \= Y.
brother(X, Y) :- male(X), mother(Z, X), mother(Z, Y), X \= Y.

如果对任何值x或y返回true,我想要一个规则名称。 我们说x = bettyy = john

mother(betty, john).< - 这将满足所以我的规则应该返回'母亲'。 类似地,如果任何其他规则或事实对某些值x,y满足,则应返回该规则名称。

我怎样才能实现这样的目标?

2 个答案:

答案 0 :(得分:4)

可能很容易

query_family(P1, P2, P) :-
    % current_predicate(P/2),
    member(P, [father, mother, husband, wife, son, daughter, sister, brother]),
    call(P, P1, P2).

给出了

?- query_family(betty, john, R).
R = mother ;
false.

?- query_family(betty, X, R).
X = john,
R = mother ;
X = dana,
R = mother ;
X = bob,
R = wife ;
X = bob,
R = wife ;
false.
答案之后的分号意味着'gimme next'

答案 1 :(得分:1)

$ swipl
?- ['facts'].
?- setof( Functor,
          Term^(member(Functor, [father, mother, husband, wife, son, daughter, sister, brother]),
           Term =.. [Functor, betty, john],
           once(Term)),
          Answer).

Answer = [mother].
?- 

如果您想避免必须指定感兴趣的仿函数列表,可以使用current_predicate(F/2)