Prolog SLD解析树,哪个谓词适用于给出第一个重溶剂

Prolog SLD解析树,哪个谓词适用于给出第一个重溶剂,prolog,logic-programming,unification,Prolog,Logic Programming,Unification,我一直在想我可以解决SLD树,直到我在过去的论文中发现这个问题 第一次选择哪个谓词 我假设这是第三条规则,但是有人能给我解释一下如何解决这个问题吗?只需展示一个求解swap([1,2],U) 我们如何将([S,H | U])与U统一起来 编辑 假设我试图统一: swap([H,S|T],[S,H|U])withswap([1,2],U) 我最终得到了swap([],U']),但是这如何与3个给定的事实/规则相结合,从而得到U=[2,1] ([S,H | U])和U不应共享变量U。在应用规则之前,

我一直在想我可以解决SLD树,直到我在过去的论文中发现这个问题

第一次选择哪个谓词

我假设这是第三条规则,但是有人能给我解释一下如何解决这个问题吗?只需展示一个求解
swap([1,2],U)

我们如何将
([S,H | U])
U
统一起来

编辑 假设我试图统一:

swap([H,S|T],[S,H|U])
with
swap([1,2],U)

我最终得到了
swap([],U'])
,但是这如何与3个给定的事实/规则相结合,从而得到
U=[2,1]


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

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

从知识库中选择谓词子句时,您应该一致地重命名其变量,以便它们都是“新的”,即新的,即在过程中尚未看到所选子句中的新名称。比如说,

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) 
                ->
          ........
求解:交换([1,2],U)。
选择:
->交换([],[])。
交换([H1,S1 | T1],[S1,H1 | U1]):-交换(T1,U1)。
=匹配,带有
{[H1,S1 | T1]=[1,2]
,[S1,H1 | U1]=U}
即
{H1=1,S1=2,T1=[],U=[2,1 | U1]}
->现在解决身体问题
交换(T1,U1)
即
掉期([],U1)
->
........
要完成该示例,您必须通过与此答案相同的过程求解
swap([],U1)
,选择谓词
swap/2的三个子句中的每一个:

  • 交换([],[])。
    (它与
    交换([],[])匹配吗?
    • 是的,它统一了
      U1=[]
      。 然后将其用于统一
      U
      ,即
      U=[S1,H1 | U1]=[2,1 | U1]=[2,1 |[]]=[2,1]
  • swap([H2],[H2])。
    (它是否匹配
    swap([],U1)
    ?)
  • 等等

  • 当然,如果您可以将变量重命名为任何名称,如
    swap([A99],[A99])。
    ,只要重命名是一致的(即,只重命名一次变量,并一致地使用新名称代替旧名称)。

    从知识库中选择谓词子句时,您应该一致地重命名其变量,因此,它们都是“新的”,即新的,即在过程中未看到所选子句中的新名称。比如说,

    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) 
                    ->
              ........
    
    求解:交换([1,2],U)。
    选择:
    ->交换([],[])。
    交换([H1,S1 | T1],[S1,H1 | U1]):-交换(T1,U1)。
    =匹配,带有
    {[H1,S1 | T1]=[1,2]
    ,[S1,H1 | U1]=U}
    即
    {H1=1,S1=2,T1=[],U=[2,1 | U1]}
    ->现在解决身体问题
    交换(T1,U1)
    即
    掉期([],U1)
    ->
    ........
    
    要完成该示例,您必须通过与此答案相同的过程求解
    swap([],U1)
    ,选择谓词
    swap/2的三个子句中的每一个:

  • 交换([],[])。
    (它与
    交换([],[])匹配吗?
    • 是的,它统一了
      U1=[]
      。 然后将其用于统一
      U
      ,即
      U=[S1,H1 | U1]=[2,1 | U1]=[2,1 |[]]=[2,1]
  • swap([H2],[H2])。
    (它是否匹配
    swap([],U1)
    ?)
  • 等等

  • 当然,如果您可以将变量重命名为任何名称,如
    交换([A99],[A99])。
    ,只要重命名是一致的(即,只重命名一次变量,并使用新名称代替旧名称,保持一致).

    你能告诉我在获得第一个MGU之前你是如何统一这些表达式的吗?更新它的变量吗?你能告诉我在获得第一个MGU之前你是如何统一这些表达式的吗?更新它的变量吗?谢谢,这更有意义,但是,你能给我解释一下prolog是如何获得U=[2,1]的吗?第二个匹配是什么?或者干脆结束这个例子?
    [S1,H1 | U1]=U
    U=[S1,H1 | U1]
    相同。我们还有
    {H1=1,S1=2}
    。因此,
    2
    可以替换为
    S1
    ,1可以替换为
    H1
    。没有第二个匹配,
    {H1=1,S1=2,T1=[],U=[2,1 | U1]}
    {[H1,S1 | T1]=[1,2],[S1,H1 | U1]=U}
    相同。这就是你所说的吗?很高兴能帮上忙。下次请将图片中的代码作为文本输入到您的问题中。否则,这是一个被问得很好的问题,最重要的是,你一直在订婚,为此你感到荣幸!和快乐的步道,学习序言。:)谢谢,这更有意义,但是,你能解释一下,prolog是如何获得U=[2,1]的吗?第二个匹配是什么?或者干脆结束这个例子?
    [S1,H1 | U1]=U
    U=[S1,H1 | U1]
    相同。我们还有
    {H1=1,S1=2}
    。因此,
    2
    可以替换为
    S1
    ,1可以替换为
    H1
    。没有第二个匹配,
    {H1=1,S1=2,T1=[],U=[2,1 | U1]}
    {[H1,S1 | T1]=[1,2],[S1,H1 | U1]=U}
    相同。这就是你所说的吗?很高兴能帮上忙。下次请将图片中的代码作为文本输入到您的问题中。否则,这是一个问得很好的问题,最重要的是,你留下来