如果您有下一行的Prolog声明:
move(state(middle, onbox, middle, hasnot),
grasp,
state(middle, onbox, middle, has)).
Run Code Online (Sandbox Code Playgroud)
移动和状态函子都是?
我对事实,仿函数,条款......感到困惑......
在Prolog中,functors是我们用来构建简单结构(复合术语)的句法元素.
想想绑定的 Prolog术语的层次结构,其中包含最简单的"原子"情况,即原子和数字.添加到这些Prolog 变量,可以根据上下文绑定或不绑定.Prolog仿函数名称(标识符)的规则与Prolog原子的规则相同
函数是具有有限数量参数的语法单元("arity"),如果为仿函数提供了这些参数的术语,那么我们得到一个复合项.在你的例子中有一个move带有三个参数的主函子,所以它的arity是3.函子名称和arity经常组合,因为技术上Prolog将两个不同的arities作为不同的functor处理相同的functor名称,所以我们可以参考move/3作为复合词的外部函子.
请注意,术语示例中的第一个和第三个参数本身就是复合术语,使用仿函数state/4构建:
move(state(middle, onbox, middle, hasnot),
grasp,
state(middle, onbox, middle, has))
Run Code Online (Sandbox Code Playgroud)
在这里,我从示例的末尾删除了句点.可能在其原始语境中,这确实是一个Prolog"事实",尽管它也可能是一个查询.Prolog中的期间可以终止术语的输入.
这里的关键点是Prolog 谓词是仿函数的特例.如果move/3是一个谓词(带三个参数),那么你的例子可能是一个事实(如果它在你的应用程序中的某个地方被断言)或一个查询(例如,如果被置为顶级目标).根据我们上面所说的关于具有两个不同arities的函子名称,Prolog将不同arities的谓词名称视为不同的谓词!
Prolog使用仿函数来表达事实(和规则)使其成为一个相当光滑和强大的元编程环境.Prolog有一个=..名为univ的特殊内置谓词(运算符),它将一个复合项解包到一个列表中,该列表的头部是主要的函子名称,其余项目是特定复合项中赋予该函子的参数.例如:
?- X = state(middle, onbox, middle, hasnot), X =.. List.
X = state(middle, onbox, middle, hasnot)
List = [state, middle, onbox, middle, hasnot]
yes
Run Code Online (Sandbox Code Playgroud)
这允许我们在两个方向上在Prolog列表和复合词之间进行转换,并在需要时"动态地"构建Prolog目标(使用术语的主要函子的谓词名称).
| 归档时间: |
|
| 查看次数: |
6151 次 |
| 最近记录: |