我以为我可以解决SLD树,直到我在过去的论文中找到这个问题。
第一次选择哪个谓词?
我认为这是第三条规则,但有人可以通过简单地展示解决swap([1,2], U)
我们如何将([S,H|U])
与U
统一起来?
修改 假设我试图统一:
带有swap([H,S|T], [S,H|U])
的 swap([1,2], U)
[H,S|T] = [1,2], [S,H|U] = U
H = 1, S = 2, T = [], [S,H|U] = U
H = 1, S = 2, T = [], [2,1|U] = U
H = 1, S = 2, T = [], U = [2,1|U]
我最终得到swap([], U'])
但是如何与3个给定的事实/规则统一以产生U = [2,1]
答案 0 :(得分:4)
当从知识库中选择一个谓词的子句时,你应该一致地重命名它的变量,这样它们都是“新鲜的”,即新的,即在过程中还没有看到所选子句中的新名称。例如,
solving: swap([1,2], U).
selecting:
-> swap([], []).
<- doesn't match
-> swap([H0], [H0]).
<- doesn't match
-> swap([H1,S1|T1], [S1,H1|U1]) :- swap( T1, U1).
= matches, with
{ [H1,S1|T1] = [1,2]
, [S1,H1|U1] = U }
i.e.
{ H1 = 1, S1 = 2, T1 = [], U = [2,1|U1] }
-> now solve the body
swap( T1, U1)
i.e.
swap( [], U1)
->
........
要完成示例,您必须按照与此答案相同的步骤解决swap( [], U1)
,并选择谓词swap/2
的三个子句中的每一个:
swap([], []).
(它与swap( [], U1)
匹配吗?)
U1 = []
。
然后将其用于U
的统一,即
U = [S1,H1|U1] = [2,1|U1] = [2,1|[]] = [2,1]
。swap([H2],[H2]).
(它与swap( [], U1)
匹配吗?)如果当然你可以将变量重命名为swap([A99],[A99]).
,只要重命名是一致的(即只重命名变量一次,并使用新名称代替旧名称,一致)。
答案 1 :(得分:1)
([S,H|U])
和U
不应该共享变量U.在应用规则之前,您必须“刷新”其变量,例如通过添加下划线或素数。然后,您将统一([S',H'|U'])
和U
。