今天是我学习Prolog的第二天。 我不太了解Prolog。 我有一个包含此事实/规则的文件。
mother(X,Y):-
parent(X,Y),
female(X).
son(X,Y):-
parent(Y,X),
male(X).
daughter(X,Y):-
parent(Y,X),
female(X).
grandmother(X,Y):-
parent(Z,Y),
parent(X,Z),
female(X).
和
son(a,b).
daughter(b,c).
我可以提问
?- mother(b,a).
?- parent(b,a).
?- grandmother(c,a).
Prolog的。
答案 0 :(得分:0)
不确定。
您是否希望演绎(1)b
是a
的母亲,(2)b
是a
的父母,(3){{1} } c
的祖母是仅来自(a)a
是a
的儿子,(b)b
是b
的女儿?
在这种情况下,在我看来,您可以从以下事实和规则中推断出(1)和(2)
c
并且不知道如何演绎(3)(son(a, b).
daughter(b, c).
female(X) :-
daughter(X, _).
parent(X, Y) :-
son(Y, X).
mother(X, Y) :-
female(X),
parent(X, Y).
是c
的祖母),因为我可以推断a
是c
的祖父母,但我不喜欢我不知道如何推断a
是女性。
添加事实c
和规则female(c)
(以及来自grandmother
的{{1}}规则),您可以使用以下事实和规则推断(3)
parent
其他解决方案也是可能的。
答案 1 :(得分:0)
儿子(a,b)是指a是b或b的儿子是a的儿子吗? Prolog并不关心,但你必须决定如何使用它。
我认为这意味着b是a的儿子。然而,这不是关于Prolog的事实。这只是我对某人意味着什么的猜测。
现在,您是否有信息告诉您谁是母亲?
如果你问 ? - 母亲(Z,a)。 它将使用母亲的定义来试图满足 ? - 女性(Z),父母(Z,a)。 现在它将使用女性的定义将其更改为: ? - 女儿(Z,_),父母(Z,a)。 它将使用事实子(b,c)来满足Z = b的女儿。 然后查询的其余部分是: ? - 父母(b,a)。 但我们还没有完成。 b实际上是一个父母吗? 父母有两种定义。所以,试试第一个, 将查询更改为: ? - 儿子(a,b)。 成功 - 这与事实相符。 所以答案是? - 母亲(Z,a)。是Z = b。
关于Prolog如何运作的事情要记住:
它总是有一个必须连续满足的一个或多个查询的列表;
当它使用规则时,会将列表中的第一个查询转换为一个或多个查询以替换它;
当它使用一个事实时,它只会使列表中的第一个查询消失(通过将其与事实相匹配),这就是列表最终变为空的方式。
当有多个规则或事实与查询匹配时,Prolog会尝试匹配的第一个规则或事实,但会记住下一个匹配的规则。如果它最终无法满足所有查询,则会备份到最近的非重复替代。
当我教Prolog的时候,我让整个班级大声朗读“最近的重复替代”,因为这是你必须永远记住的事情。
这可能很有用: