如果你有下一行的Prolog声明:
move(state(middle, onbox, middle, hasnot),
grasp,
state(middle, onbox, middle, has)).
移动和状态函子都是吗?
我对事实,算子,条款......感到困惑。
答案 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)
是的,move
和state
是仿函数。 F
中的仿函数为F(Term1, ...)
。但它们不是事实:在你的情况下,只有一个事实,即完整的一行。
答案 2 :(得分:4)
Functors描述一个术语,但不是术语本身(如命令式语言中的方法签名),由结构或谓词的名称和arity组成。
在您的示例中,仿函数为move/3
和state/4
。
请注意,foo(a)
和foo(a,b)
有不同的仿函数,foo/1
和foo/2
。