2016-09-02 63 views
0

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

+1

什么是你的问题? – Daniel

+0

对不起,如果我的英语太差,我可以从序言中质疑谁是谁的母亲? –

+1

你的英文似乎很好,我只是不明白你的问题是什么。你想知道什么? – Daniel

回答

0

不确定要理解。

你想演绎(1)ba母亲,(2)ba父母和(3)ca奶奶从事实出发仅是:(a)a是(b)b的女儿是c的女儿?

在这种情况下,在我看来,你可以推断出(1)和(2)从下面的事实和规则

son(a, b). 
daughter(b, c). 

female(X) :- 
    daughter(X, _). 

parent(X, Y) :- 
    son(Y, X). 

mother(X, Y) :- 
    female(X), 
    parent(X, Y). 

而且不知道如何演绎(3)(c是奶奶a),因为我可以推断ca的祖父母,但我不知道如何推断c是女性。

添加的事实female(c)和规则grandmother(加上parentdaughter导出规则),你可以用下面的事实和规则推断(3)。

son(a, b). 
daughter(b, c). 
female(c). 

female(X) :- 
    daughter(X, _). 

parent(X, Y) :- 
    son(Y, X). 

parent(X, Y) :- 
    daughter(Y, X). 

mother(X, Y) :- 
    female(X), 
    parent(X, Y). 

grandmother(X, Z):- 
    mother(X, Y), 
    parent(Y, Z). 

其他解决方案是可能的。

0

儿子(a,b)是指a是b还是b的儿子是儿子? Prolog不在乎,但你必须下定决心如何使用它。

我认为这意味着b是a的儿子。然而,这对Prolog来说并不是事实。这只是我猜测某人的意思。

现在,你是否有信息告诉你谁是谁的母亲?

如果你问 ? - 母亲(Z,a)。 它会使用母亲的定义来试图满足 ? - 女性(Z),父母(Z,a)。 现在它将使用女性的定义将其更改为: ? - 女儿(Z,_),父母(Z,a)。 它将使用事实女儿(b,c)来满足Z = b的女儿。 然后查询的其余部分是: ? - parent(b,a)。 但是我们没有完成。 b实际上是a的父母吗? 家长有两种定义。因此,请尝试第一个, 将查询更改为: ? - son(a,b)。 成功 - 符合事实。 所以答案? - 母亲(Z,a)。是Z = b。

要记住的是怎么事情Prolog的作品有:

  • 它总是有一个必须是连续的满足一个或多个查询的列表;

    • 它查找将匹配该列表中第一个查询的事实或规则;
  • 当它使用规则时,它将列表中的第一个查询转换为一个或多个查询来替换它;

  • 当它使用事实时,它只是简单地使列表中的第一个查询消失(通过将它匹配到一个事实),这就是列表最终变为空的方式。

  • 当有多个规则或事实与查询相匹配时,Prolog会尝试匹配的第一个,但会记住下一个匹配的是什么。如果它最终不能满足所有的疑问,它将支持最近的UNTRIED ALTERNATIVE。

当我在教学Prolog的,我有全班同学背诵出声来,“最近的未经考验的选择”,因为这是你必须记住的东西。

这可能是有用的:

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