【问题标题】:In Prolog, is a fact the same as a functor?在 Prolog 中,事实与函子相同吗?
【发布时间】:2013-10-01 12:05:24
【问题描述】:

如果你有例如 Prolog 声明的下一行:

move(state(middle, onbox, middle, hasnot),
     grasp,
     state(middle, onbox, middle, has)).

是移动和状态函子吗?

我有点被事实、函子、术语弄糊涂了……

【问题讨论】:

    标签: prolog


    【解决方案1】:

    在 Prolog 中,函子是 syntactic elements we use to build structures(复合项)来自更简单的函子。

    考虑绑定 Prolog 术语的层次结构,其基础包含最简单的“原子”情况,即原子数字。添加到这些 Prolog 变量,这些变量可能会被绑定或不被绑定,具体取决于上下文。 Prolog 函子名称(标识符)的规则与 Prolog 原子的规则相同

    函子是具有有限数量的参数(“arity”)的句法单元,如果为函子提供了这些参数的术语,那么我们得到一个复合术语。在您的示例中,有一个带有三个参数的主函子 move,因此它的元数为 3。函子名称和元数通常组合在一起,因为从技术上讲,Prolog 将具有两个不同元数的相同函子名称视为不同的函子,因此我们可能将 move/3 称为复合词的外函子。

    请注意,术语示例中的第一个和第三个参数本身就是复合术语,使用仿函数 state/4 构建:

    move(state(middle, onbox, middle, hasnot),
         grasp,
         state(middle, onbox, middle, has))
    

    在这里,我从您的示例末尾删除了句点。可能在其原始上下文中,这确实是 Prolog 的“事实”,尽管它也可能是一个查询。 Prolog 中的句点可以作为术语的终止输入。

    这里的关键是Prolog 谓词是函子的特例。如果 move/3 是一个谓词(带三个参数),那么您的示例可能是一个事实(如果它在您的应用程序中的某个地方断言)或一个查询(例如,如果作为顶级目标提出) )。根据我们上面所说的关于具有两个不同元数的函子名称,Prolog 将具有不同元数的谓词名称视为不同的谓词!

    Prolog 使用函子来表达事实(和规则)使其成为一个相当流畅和强大的metaprogramming environment。 Prolog 有一个特殊的内置谓词(运算符=..),称为univ,它将复合项解压缩到一个列表中,该列表的头部是主函子的名称,其余项是在特定复合项中赋予该函子的参数。例如:

    ?- X = state(middle, onbox, middle, hasnot), X =.. List.
    
    X = state(middle, onbox, middle, hasnot)
    List = [state, middle, onbox, middle, hasnot]
    
    yes
    

    这允许我们在 Prolog 列表和复合术语之间双向转换,并在需要时“动态”构建 Prolog 目标(使用谓词名称作为术语的主要函子)。

    【讨论】:

    • 越来越清晰了。需要转变思想,这可能需要几天时间。我开始明白了。变量是否也是项,无论是否绑定?
    • 是的,变量也是 Prolog 术语(列表也是)。
    • 可能对 Haskell Curry 的书数学逻辑基础感兴趣,他说 ...仿函数是一种组合短语以形成其他短语的方法...
    【解决方案2】:

    是的,movestate 是函子。函子是F 中的F(Term1, ...)。但它们不是事实:在你的情况下,只有一个事实,即完整的一行。

    【讨论】:

    • 而且整个也是一个名词?
    • @LievenCardoen 是的,这是一个术语。它由更简单的子项构成,例如 state(middle, onbox, middle, hasnot)middle 等。但请注意,statemove 不是它的子项。
    【解决方案3】:

    函子描述一个术语,但不是术语本身(如命令式语言中的方法签名),由结构或谓词的名称和数量组成。

    在您的示例中,函子是 move/3state/4

    注意foo(a)foo(a,b) 有不同的函子,foo/1foo/2

    【讨论】:

    • 那么一个 Functor 可以存在多个术语吗?是这样看的吗?
    • @LievenCardoen 术语是文字,但函子是概念,如果有帮助的话。
    猜你喜欢
    • 1970-01-01
    • 2017-02-14
    • 2014-07-19
    • 1970-01-01
    • 1970-01-01
    • 2017-10-04
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多