【问题标题】:Prolog - Unification of complex termsProlog - 复杂术语的统一
【发布时间】:2021-10-30 02:52:43
【问题描述】:

我目前正在准备 AI 考试,我最后要复习的是 Prolog。

您可以在下面看到我要解决的问题:

如果可能,将uncle(brother(W), Q)uncle(john, mother(S)) 统一起来

我完全迷失在高层次上,它没有统一,但我想我对Prolog的了解有点过时了。

如果可能的话,有人可以帮助我了解如何统一它们吗?我不明白如何将仿函数统一为原子。

谢谢!

【问题讨论】:

    标签: prolog unification


    【解决方案1】:

    我发现在学习句法统一时,如果先将术语分解为抽象语法树,然后再进行统一,效果会更好。进行分解确实有助于嵌套列表。所以在分解之后你有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。

    限制话语我无法让图像与我想要的实际 Prolog 术语对齐,但总比没有它们要好。

    【讨论】:

    • 那是很好的表达和详尽的。谢谢,这就是我正在寻找的确切示例。你真的帮了我大忙。
    • 值得注意的是 write_term/2 谓词 dotlist/1 选项不是标准的,在大多数 Prolog 系统中也不需要。还有一个更好的标准谓词用于显示术语结构而忽略运算符定义:write_canonical/1
    猜你喜欢
    • 2020-02-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多