如果您有下一行的Prolog声明:
move(state(middle, onbox, middle, hasnot), grasp, state(middle, onbox, middle, has)).
移动和状态函子都是?
我对事实,仿函数,条款......感到困惑......
是的, move 和 state 是仿函数 . F(Term1, ...) 中的一个仿函数是 F . 但它们不是事实:在你的情况下,只有一个事实,那就是完整的路线 .
move
state
F(Term1, ...)
F
在Prolog中,仿函数是syntactic elements we use to build structures(复合词) .
想想绑定的Prolog术语的层次结构,其中包含最简单的"atomic"个案例,即原子和数字 . 添加到这些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))
在这里,我从示例的末尾删除了句点 . 可能在其原始语境中,这确实是一个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目标(使用术语的主要函子的谓词名称) .
函数描述一个术语,但不是术语本身(如命令式语言中的方法签名),由结构或谓词的名称和arity组成 .
在您的示例中,仿函数是 move/3 和 state/4 .
move/3
state/4
请注意 foo(a) 和 foo(a,b) 具有不同的仿函数 foo/1 和 foo/2 .
foo(a)
foo(a,b)
foo/1
foo/2
3 回答
是的,
move
和state
是仿函数 .F(Term1, ...)
中的一个仿函数是F
. 但它们不是事实:在你的情况下,只有一个事实,那就是完整的路线 .在Prolog中,仿函数是syntactic elements we use to build structures(复合词) .
想想绑定的Prolog术语的层次结构,其中包含最简单的"atomic"个案例,即原子和数字 . 添加到这些Prolog变量,可以根据上下文绑定或不绑定 . Prolog仿函数名称(标识符)的规则与Prolog原子的规则相同
函数是具有有限数量参数的语法单元("arity"),如果为仿函数提供了这些参数的术语,那么我们得到一个复合项 . 在你的例子中有一个带有三个参数的主要函子
move
,因此它的arity是3.函子名称和arity经常被组合,因为技术上Prolog将两个不同的arities作为不同的functor处理相同的functor名称,所以我们可能会参考 move/3 作为复合词的外部函子 .请注意,术语示例中的第一个和第三个参数本身就是复合术语,使用仿函数 state/4 构建:
在这里,我从示例的末尾删除了句点 . 可能在其原始语境中,这确实是一个Prolog“事实”,尽管它也可能是一个查询 . Prolog中的期间可以终止术语的输入 .
这里的关键点是Prolog谓词是仿函数的特例 . 如果 move/3 是一个谓词(带三个参数),那么你的例子可能是一个事实(如果它在你的应用程序中的某个地方被断言)或一个查询(例如,如果被置为顶级目标) . 根据我们上面所说的关于具有两个不同arities的函子名称,Prolog将不同arities的谓词名称视为不同的谓词!
Prolog使用仿函数来表达事实(和规则)使它变得相当光滑和强大metaprogramming environment . Prolog有一个特殊的内置谓词(运算符
=..
),名为univ,它将复合项解包为一个列表,其头部是主要的仿函数名称,其余项目是特定复合项中赋予该仿函数的参数 . 例如:这允许我们在两个方向上在Prolog列表和复合词之间进行转换,并在需要时“动态地”构建Prolog目标(使用术语的主要函子的谓词名称) .
函数描述一个术语,但不是术语本身(如命令式语言中的方法签名),由结构或谓词的名称和arity组成 .
在您的示例中,仿函数是
move/3
和state/4
.请注意
foo(a)
和foo(a,b)
具有不同的仿函数foo/1
和foo/2
.