这个Prolog代码是如何工作的(祖父母)?

时间:2017-01-10 17:28:35

标签: prolog

如果你有这些事实:

parent(albert, bob).
parent(albert, betsy).
parent(albert, bill).

parent(alice, bob).
parent(alice, betsy).
parent(alice, bill).

parent(bob, carl).
parent(bob, charlie).

然后这段代码:

grand_parent(X, Y) :-
parent(Z, X),
parent(Y, Z).

如果你输入:

grand_parent(carl, A)

然后它返回:

A = albert ? ;
A = alice ? ;
no

这是如何工作的?
这有点令人困惑。特别是“Z”部分。

1 个答案:

答案 0 :(得分:4)

我敢打赌,如果使用更好的变量名,它看起来就不那么令人困惑了:

I/ResultCount: 6
I/Row: 0
I/Column 0: bucket_id, value: -2075821635
I/Column 1: _id, value: 43
I/Column 2: _data, value: /storage/emulated/0/DCIM/DSC_0339.jpg
I/Column 3: bucket_display_name, value: DCIM
I/Row: 1
I/Column 0: bucket_id, value: -2075821635
I/Column 1: _id, value: 44
I/Column 2: _data, value: /storage/emulated/0/DCIM/DSC_0934.jpg
I/Column 3: bucket_display_name, value: DCIM
I/Row: 2
I/Column 0: bucket_id, value: -2075821635
I/Column 1: _id, value: 45
I/Column 2: _data, value: /storage/emulated/0/DCIM/DSC_2057m.jpg
I/Column 3: bucket_display_name, value: DCIM
I/Row: 3
I/Column 0: bucket_id, value: -2075821635
I/Column 1: _id, value: 46
I/Column 2: _data, value: /storage/emulated/0/DCIM/DSC_2132.jpg
I/Column 3: bucket_display_name, value: DCIM
I/Row: 4
I/Column 0: bucket_id, value: -2075821635
I/Column 1: _id, value: 47
I/Column 2: _data, value: /storage/emulated/0/DCIM/DSC_4258.jpg
I/Column 3: bucket_display_name, value: DCIM
I/Row: 5
I/Column 0: bucket_id, value: 902704159
I/Column 1: _id, value: 63
I/Column 2: _data, value: /storage/emulated/0/DataSync/DSC_0249.jpg
I/Column 3: bucket_display_name, value: DataSync

当您询问查询grand_parent(Grandchild, Grandparent) :- parent(Parent, Grandchild), parent(Grandparent, Parent). 时,您会看到,Prolog将找到grand_parent(carl, X)的定义,并将grand_parent/2替换为carl。为了证明这一点,它必须证明Grandchild。好吧,这会成功一次,将parent(Parent, carl)Parent统一起来。逗号的作用类似于"和",所以现在Prolog必须证明bob。它成功,将parent(Grandparent, bob)Grandparent统一起来。 Prolog总是按照你提供事实的顺序搜索数据库,这就是为什么我们在获得Alice之前得到Albert的原因。

当您点击albert时,它就像您正在与Prolog进行对话,而您正在说"或?"好像要提示另一个解决方案。所以Prolog会回到最后的选择点并开始向前扫描。最后一个选择点位于;,因此它向前扫描,直到找到成功的parent(Grandparent, bob),并将parent(alice, bob)Grandparent统一起来。你要求它提供另一种解决方案,它会耗尽alice的所有可能性,因此它将备份到parent(Grandparent, bob),而parent(Parent, carl)找不到更多解决方案。那时Prolog说false因为它没有想法。

希望这有帮助!