在Prolog中,事实与仿函数一样吗?

时间:2013-10-01 12:05:25

标签: prolog

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

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

移动和状态函子都是吗?

我对事实,算子,条款......感到困惑。

3 个答案:

答案 0 :(得分:7)

在Prolog仿函数中,syntactic elements we use to build structures(复合词)来自较简单的仿函数。

考虑绑定 Prolog术语的层次结构,其中包含最简单的“原子”案例,即 atoms numbers 。添加到这些Prolog 变量,根据上下文可能会绑定或不绑定。 Prolog仿函数名称(标识符)的规则与Prolog原子的规则相同

Functors是具有有限数量参数的语法单元(“arity”),如果为仿函数提供了这些参数的术语,那么我们得到一个复合项。在你的例子中有一个带有三个参数的主要仿函数move,因此它的arity是3.仿函数名称和arity经常组合在一起,因为技术上Prolog将两个不同的arities视为同一个仿函数名称作为不同的仿函数,所以我们可能会将 move / 3 称为复合词的外部函子。

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

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

在这里,我从示例结尾处删除了句点。可能在其原始语境中,这确实是一个Prolog“事实”,尽管它也可能是一个查询。 Prolog中的期间可以终止术语的输入。

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

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目标(使用术语主要函子的谓词名称)。

答案 1 :(得分:6)

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

答案 2 :(得分:4)

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

在您的示例中,仿函数为move/3state/4

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