SLD解析树,哪个谓词适用于给予第一次重新溶剂

时间:2018-05-19 22:04:38

标签: prolog logic-programming unification

我以为我可以解决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]

Logic Program Question

2 个答案:

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

  1. swap([], []).(它与swap( [], U1)匹配吗?)
    • 是的,确实如此,统一了U1 = []。 然后将其用于U的统一,即 U = [S1,H1|U1] = [2,1|U1] = [2,1|[]] = [2,1]
  2. swap([H2],[H2]).(它与swap( [], U1)匹配吗?)
  3. 等。
  4. 如果当然你可以将变量重命名为swap([A99],[A99]).,只要重命名是一致的(即只重命名变量一次,并使用新名称代替旧名称,一致)。

答案 1 :(得分:1)

([S,H|U])U不应该共享变量U.在应用规则之前,您必须“刷新”其变量,例如通过添加下划线或素数。然后,您将统一([S',H'|U'])U