Prolog SLD解析树,哪个谓词适用于给出第一个重溶剂
我一直在想我可以解决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。在应用规则之前,
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。在应用规则之前,必须“刷新”其变量,例如添加下划线或素数。然后统一([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}
相同。这就是你所说的吗?很高兴能帮上忙。下次请将图片中的代码作为文本输入到您的问题中。否则,这是一个问得很好的问题,最重要的是,你留下来