例如,如果您有 Prolog 声明的下一行:
move(state(middle, onbox, middle, hasnot),
grasp,
state(middle, onbox, middle, has)).
移动和状态函子都是?
我有点被事实、函子、术语弄糊涂了……
例如,如果您有 Prolog 声明的下一行:
move(state(middle, onbox, middle, hasnot),
grasp,
state(middle, onbox, middle, has)).
移动和状态函子都是?
我有点被事实、函子、术语弄糊涂了……
在 Prolog 中,函子是我们用来从更简单的结构(复合术语)构建结构的句法元素。
考虑绑定Prolog 术语的层次结构,其基础包含最简单的“原子”情况,即atom和numbers。添加到这些 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 目标(使用谓词名称作为术语的主要函子)。
是的,move
并且state
是函子。一个函子F
在F(Term1, ...)
. 但它们不是事实:在您的情况下,只有一个事实,即完整的线。
函子描述了一个术语,但不是术语本身(如命令式语言中的方法签名),它由结构或谓词的名称和数量组成。
在您的示例中,函子是move/3
and state/4
。
注意foo(a)
和foo(a,b)
有不同的函子,foo/1
和foo/2
。