如果你有这些事实:
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”部分。
答案 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
因为它没有想法。
希望这有帮助!