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 的三个子句中的每一个:

  1. swap([], []).(是否匹配swap( [], U1)?)
    • 是的,确实如此,统一了 U1 = []。 然后将其用于 U 的统一,即
      U = [S1,H1|U1] = [2,1|U1] = [2,1|[]] = [2,1].
  2. swap([H2],[H2]).(是否匹配swap( [], U1)?)

如果你当然可以将变量重命名为任何东西,比如 swap([A99],[A99]).,只要重命名是一致的(即只重命名一个变量一次,并使用新名称代替旧名称,始终如一).