正在使用的Prolog事实和规则

时间:2016-09-02 16:47:43

标签: prolog

今天是我学习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的

2 个答案:

答案 0 :(得分:0)

不确定。

您是否希望演绎(1)ba的母亲,(2)ba的父母,(3){{1} } c的祖母是来自(a)aa的儿子,(b)bb的女儿?

在这种情况下,在我看来,您可以从以下事实和规则中推断出(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的祖母),因为我可以推断ac的祖父母,但我不喜欢我不知道如何推断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的时候,我让整个班级大声朗读“最近的重复替代”,因为这是你必须永远记住的事情。

这可能很有用:

http://www.covingtoninnovations.com/books/PPID.pdf