首页 文章

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

提问于
浏览
6

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

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

移动和状态函子都是?

我对事实,仿函数,条款......感到困惑......

3 回答

  • 7

    是的, movestate 是仿函数 . F(Term1, ...) 中的一个仿函数是 F . 但它们不是事实:在你的情况下,只有一个事实,那就是完整的路线 .

  • 4

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

  • 5

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

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

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

相关问题