【发布时间】:2013-10-01 12:05:24
【问题描述】:
如果你有例如 Prolog 声明的下一行:
move(state(middle, onbox, middle, hasnot),
grasp,
state(middle, onbox, middle, has)).
是移动和状态函子吗?
我有点被事实、函子、术语弄糊涂了……
【问题讨论】:
标签: prolog
如果你有例如 Prolog 声明的下一行:
move(state(middle, onbox, middle, hasnot),
grasp,
state(middle, onbox, middle, has)).
是移动和状态函子吗?
我有点被事实、函子、术语弄糊涂了……
【问题讨论】:
标签: prolog
在 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 目标(使用谓词名称作为术语的主要函子)。
【讨论】:
是的,move 和 state 是函子。函子是F 中的F(Term1, ...)。但它们不是事实:在你的情况下,只有一个事实,即完整的一行。
【讨论】:
state(middle, onbox, middle, hasnot)、middle 等。但请注意,state 和 move 不是它的子项。
函子描述一个术语,但不是术语本身(如命令式语言中的方法签名),由结构或谓词的名称和数量组成。
在您的示例中,函子是 move/3 和 state/4。
注意foo(a) 和foo(a,b) 有不同的函子,foo/1 和foo/2。
【讨论】: