11

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

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

移动和状态函子都是?

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

4

3 回答 3

9

在 Prolog 中,函子是我们用来从更简单的结构(复合术语)构建结构的句法元素。

考虑绑定Prolog 术语的层次结构,其基础包含最简单的“原子”情况,即atomnumbers。添加到这些 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 使用函子来表达事实(和规则)使其成为一个相当流畅和强大的元编程环境。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 目标(使用谓词名称作为术语的主要函子)。

于 2013-10-01T16:57:39.983 回答
8

是的,move并且state是函子。一个函子FF(Term1, ...). 但它们不是事实:在您的情况下,只有一个事实,即完整的线。

于 2013-10-01T12:19:00.347 回答
4

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

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

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

于 2013-10-01T12:20:36.693 回答