SLD 解析树,哪个谓词适用于给出第一个 re-solvent
SLD resolution tree, Which predicate applies to give first re-solvent
我一直在想我可以解决 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 统一 facts/rules 以导致 U = [2,1]
([S,H|U])
和 U
不应该共享变量 U。在应用规则之前,您必须 'freshen' 它的变量,例如通过添加下划线或素数。然后你会统一 ([S',H'|U'])
和 U
.
当从知识库中选择谓词的子句时,您应该一致地重命名其变量,以便它们都是 "fresh",即新的,即尚未看到所选子句中的新名称进行中。例如,
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]).
,只要重命名是一致的(即只重命名一个变量一次,并使用新名称代替旧名称,始终如一).
我一直在想我可以解决 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 统一 facts/rules 以导致 U = [2,1]
([S,H|U])
和 U
不应该共享变量 U。在应用规则之前,您必须 'freshen' 它的变量,例如通过添加下划线或素数。然后你会统一 ([S',H'|U'])
和 U
.
当从知识库中选择谓词的子句时,您应该一致地重命名其变量,以便它们都是 "fresh",即新的,即尚未看到所选子句中的新名称进行中。例如,
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]).
,只要重命名是一致的(即只重命名一个变量一次,并使用新名称代替旧名称,始终如一).