Prolog - 复杂术语的统一
Prolog - Unification of complex terms
我目前正在准备 AI 考试,我最后要复习的是 Prolog。
下面是我要解决的问题:
如果可能的话,统一uncle(brother(W), Q)
和uncle(john, mother(S))
在高层次上我完全迷失了,它没有统一,但我想我对 Prolog 的了解有点过时了。
有人可以帮助我了解如何统一它们吗?我不明白如何将仿函数统一为原子。
谢谢!
我发现在学习语法统一时,如果先将术语分解为抽象语法树然后进行统一,效果会更好。进行分解确实有助于嵌套列表。所以在分解之后你有 brother(W)
试图与 john
统一,这将失败。一旦失败,您可以跳过其余的统一过程。
虽然这些不是抽象语法树,但谓词 =.. 和 write_term 有助于将复杂术语转换为 AST。
使用=../2
?- uncle(brother(W),Q) =.. List.
List = [uncle, brother(W), Q].
?- uncle(john,mother(S)) =.. List.
List = [uncle, john, mother(S)].
然后尝试统一各个术语
?- brother(W) = john.
false.
对于 Prolog 列表,使用带有选项 dotlists(true)
的 write_term/2
?- write_term([a],[dotlists(true)]).
.(a,[])
true.
?- write_term([a,b],[dotlists(true)]).
.(a,.(b,[]))
true.
?- write_term([a,B],[dotlists(true)]).
.(a,.(_15276,[]))
true.
?- write_term([a,[b]],[dotlists(true)]).
.(a,.(.(b,[]),[]))
true.
?- write_term([a,b,[c],[d,[e,[f],g]],h],[dotlists(true)]).
.(a,.(b,.(.(c,[]),.(.(d,.(.(e,.(.(f,[]),.(g,[]))),[])),.(h,[])))))
true.
在这个 post 中有一些用于学习句法统一的实际 AST。
由于 Discourse 的限制,我无法让图像与我想要的实际 Prolog 术语一致,但总比没有它们要好。
我目前正在准备 AI 考试,我最后要复习的是 Prolog。
下面是我要解决的问题:
如果可能的话,统一uncle(brother(W), Q)
和uncle(john, mother(S))
在高层次上我完全迷失了,它没有统一,但我想我对 Prolog 的了解有点过时了。
有人可以帮助我了解如何统一它们吗?我不明白如何将仿函数统一为原子。
谢谢!
我发现在学习语法统一时,如果先将术语分解为抽象语法树然后进行统一,效果会更好。进行分解确实有助于嵌套列表。所以在分解之后你有 brother(W)
试图与 john
统一,这将失败。一旦失败,您可以跳过其余的统一过程。
虽然这些不是抽象语法树,但谓词 =.. 和 write_term 有助于将复杂术语转换为 AST。
使用=../2
?- uncle(brother(W),Q) =.. List.
List = [uncle, brother(W), Q].
?- uncle(john,mother(S)) =.. List.
List = [uncle, john, mother(S)].
然后尝试统一各个术语
?- brother(W) = john.
false.
对于 Prolog 列表,使用带有选项 dotlists(true)
?- write_term([a],[dotlists(true)]).
.(a,[])
true.
?- write_term([a,b],[dotlists(true)]).
.(a,.(b,[]))
true.
?- write_term([a,B],[dotlists(true)]).
.(a,.(_15276,[]))
true.
?- write_term([a,[b]],[dotlists(true)]).
.(a,.(.(b,[]),[]))
true.
?- write_term([a,b,[c],[d,[e,[f],g]],h],[dotlists(true)]).
.(a,.(b,.(.(c,[]),.(.(d,.(.(e,.(.(f,[]),.(g,[]))),[])),.(h,[])))))
true.
在这个 post 中有一些用于学习句法统一的实际 AST。
由于 Discourse 的限制,我无法让图像与我想要的实际 Prolog 术语一致,但总比没有它们要好。