这个 Prolog 术语是否正确?(事实、规则、程序、谓词……)

Guy*_*der 6 terminology prolog iso-prolog

获得正确的术语是成功传达概念的一部分,当在 SO 中使用错误的术语时,带有 Prolog 标签的受访者会很好地指出错误。

在阅读 William F. Clocksin 于 1997 年 ( WorldCat ) 的“条款和效果 - 工作程序员的序言编程”时,是一段

Prolog程序由一组过程组成。每个过程定义一个特定的谓词,作为其参数之间的某种关系。一个过程由一个或多个断言子句组成。考虑两种条款很方便:事实规则

虽然我理解所有单词,但在交流 Prolog 时,每个粗体单词是否都是当前正确使用的术语?

特别是规则的使用似乎不受欢迎。

Guy*_*der 7

来自 Prolog ISO 标准

ISO/IEC 13211-1(第一版 1995-06-01)

信息技术 - 编程语言 - Prolog

第 1 部分:通用核心

第 2-10 页有大量词汇表。

3.7参数:一个术语,其与一个相关联的预测化合物术语

3.9元数:数参数a的化合物的术语。在语法上,与函子谓词关联的非负整数。

3.10断言,以:向断言子句是将其添加到用户定义的过程数据库由定义的谓词那的条款

3.19主体:一个目标,以其作为规则一部分的上下文来区分(见 3.154)。

3.21内置谓词:一个程序,其执行由执行处理器(参见8)。

3.32条款事实规则。它有两个部分:一个head和一个body

3.35完整的数据库的一组程序,其相对于执行被执行(参见7.5)。

3.37化合物术语:一个函子元数的NN正的,与序列一起N 参数

3.45控制结构:一个过程,其定义是 Prolog处理器的一部分(见 7.8)。

3.52数据库:当前在执行过程中存在的一组用户定义的过程(见 7.5)。

3.57指令:影响Prolog 文本含义的术语 (见 7.4.2),在该Prolog 文本中指令项 表示D :-(D)

3.59动态程序的):动态程序是可以在执行期间检查或更改其子句的程序,例如通过 断言撤消 子句(见 7.5.2)。

3.72事实:一个条款,其机身目标 true。注-这一事实可以被表示Prolog的文本,其主要仿既不是(:-)/1也不是(:-)/2

3.77函子:一个标识符和一个元数

3.81目标:要执行的谓词(参见正文查询和 7.7.3)。

3.84 head (of a rule ): 一个谓词,由其上下文区分。

3.88标识符:用于表示原子函子名称谓词名称的基本非结构化对象。

3.129谓词:一个标识符和一个元数

3.131谓词指示符:一个复合词 A/N,其中A是一个原子N是一个非负整数,表示一个特定的程序(见 7.1.6.6)。

3.133谓词:具有元数参数序列的谓词 NN

3.136过程控制结构内置谓词用户定义的过程。过程要么是静态的,要么是动态的。程序要么是私有的,要么是公共的(见 7.5)。

3.141 Prolog 文本:表示指令从句的一系列阅读术语(见 6.2、7.4)。

3.143查询:作为顶级交互输入给出的目标

3.154规则:一个条款,其身体不是目标 true。在执行过程中,如果主体对于某些替换为真,那么对于该替换头部也为真。规则在Prolog 文本中 由一个术语表示,其主函子是第一个参数转换为head,第二个参数转换为 body 的地方。(:-)/2

3.164静态过程的):静态过程是其子句不能改变的过程(见 7.5.2)。

3.185顶层:Prolog处理器重复输入和执行*查询的过程

3.195用户定义过程:由一系列子句定义的过程,其中每个子句头部具有相同的 谓词指示符,每个子句Prolog 文本表示或在执行期间已被断言(见 8.9)。

笔记

基本概述

h(A,B,C) :- g(A,B),h(B,C),j(A,C).
<------------------------------->  - A (HORN) CLAUSE, which is also a RULE. 
            <------------------>   - BODY of the RULE, which also a GOAL.
                                     ... only one literal: ATOMIC GOAL.
<------>                           - HEAD of the RULE, which can appear
                                     as GOAL depending on context.

f(A,B,C).                          - A CLAUSE with the elided body `true`.
                                     This is a FACT, but _not_ a RULE.
                                     Also called a UNIT CLAUSE.
f(A,B,C)  :- true.                 - Same as above, still not a RULE.
f(A,B,C)  :- !.                    - Is it a RULE? We don't know!

          :- f(A,B,C).             - A DIRECTIVE.
          :- (foo(bar)).           - Another DIRECTIVE.
Run Code Online (Sandbox Code Playgroud)

在维基百科的Horn Clause条目中可以找到略有不同的定义。特别是,“事实”被称为“没有变量的单元子句”——这与 ISO 定义不符。

非终端指标

除了谓词指示符号A/Nfunctor/arity),有符号A//N,这是不是在ISO标准(或没有,看到这个草案)。它告诉读者这个谓词用在定语从句语法 (DCG)中,除了指示的参数数量外,还为输入的“差异列表”(或“列表差异”)对采用 2 个隐藏参数。

在上面指出的标准提案中,它被描述为:

3.19非终端指示符:一个复合术语A//N,其中A是一个原子并且N是一个非负整数,表示一个特定的非终端

大多数实现将非终结nt//n符转换为谓词nt/n+2。但是,不能依赖精确的翻译方式和通过调用相应谓词直接调用非终结符的结果,即未定义具有相同名称和两个额外参数的谓词。特别是第二个附加参数必须小心处理。直接使用可能会违反,尤其是在使用时。

注意事项指令

该指令可以是另一种编写查询的方式。来自 SICStus Prolog 手册

查询和指令是指导系统执行某个或多个目标的方法。(...) 指令(与查询相反)的主要用途是允许文件包含调用各种谓词的指令,但您不希望打印出答案。在这种情况下,您只想调用谓词的效果,即您不希望在查阅文件的过程中进行终端交互。

指令也可以是源文件标记,其位置很重要(即代码元信息)。从SWI Prolog的说明书上的module指示:

该指令只能用作源文件的第一项。它将文件声明为模块文件,定义了一个名为Module 的模块

指令中使用的谓词可能非常奇特,为 Prolog 处理器提供指令和谓词元信息。来自“声明谓词属性”的 SWI Prolog 手册

本节描述操作谓词定义属性的指令。

例如,“加载有限域上的约束逻辑编程库”:

:- use_module(library(clpfd)).
Run Code Online (Sandbox Code Playgroud)

与空头的规则:- foo,这可能是因为解释false :- foo不是在Prolog中表达的约束“这是从来没有的情况下FOO ”。它用这种方式在实现中回答集编程像“ASP序言”(其中有序言-Y语法,但否则是不一样的Prolog)。

关于内置谓词的注意事项

在第 8 章第 63 页,我们发现:

“内置谓词是由符合标准的处理器提供的过程”

通俗地说,“内置谓词是 Prolog 语言的一部分”。其他谓词可能是库谓词,需要通过适当的指令将其拉入 Prolog 程序。SWI Prolog 中的示例:库谓词

注意对事实

通俗地说,“平面事实”是由基本术语表示的事实 - 一个没有变量的术语。

关于函子的注意事项

这与范畴论的“函子”无关。关于范畴论的函子,维基百科是这样说的:

函子这个词是数学家从哲学家鲁道夫卡尔纳普那里借来的,他在语言环境中使用了这个词。见 虚词

而关于“虚词”:

在语言学中,虚词(也称为函子)是指在句子中表达词与词之间的语法关系,或指明说话者的态度或情绪的词汇意义不大或意义不明确的词。

所以Prolog选择“函子”有点可惜。

注意目标

目标可以是人们所描述的“简单”,例如p(X),在这种情况下,它是一个原子目标,或者由子目标组成的树,例如p(X),q(Y)因为,是主函子的谓词(',')/2

事实上,目标通常被认为是任何可以作为规则体出现的东西。例如,p(X) -> q(Y) ; r(Z)具有主函子;(not ->) 的 绝对是一个目标。

我们的目标也可能是解决一个目标,这可能会被传递给像元谓词的变量call/1,例如:X=(Z is 1+2), call(X).

变体是元谓词使用的不完整原子目标。这命名了一个带有一些参数“在左边”预设的可调用谓词。元谓词将“在右边”与参数相邻。这被称为闭包,尽管与函数式编程不同,它实际上不是引用在函数创建时有效的上下文的函数。

例如,三个调用都输出u v w

foo(X,Y,Z) :- format("~q ~q ~q\n", [X,Y,Z]).

maplist(foo,    [u],[v],[w]). % call "foo" with 3 arguments
maplist(foo(u),     [v],[w]). % call closure foo(u) with 2 arguments
maplist(foo(u,v)       ,[w]). % call closure foo(u,v) with 1 argument
Run Code Online (Sandbox Code Playgroud)

关于谓词过程谓词指示符的注意事项

这个谓词的概念似乎漂浮在“语义空间”而不是“语法空间”:

  • “谓词事物”的名称或声明是谓词指示符
  • “谓词事物”的谓词定义是过程(大概基于代码、Prolog 或其他)。

示例

对于计算阶乘函数的 arity 2的谓词 fact

fact/2谓词指示符,并且

fact(0,1) :- !.
fact(X,F) :- Xp is (X-1), fact(Xp,Fp), F is (Fp*X).
Run Code Online (Sandbox Code Playgroud)

是可能的对应程序

在实践中,谓词也用于表示任何过程,并编写谓词指示符来识别它。

过程,其承认为逻辑解释,并允许变量任何的它的参数将一个关系数据库判释逻辑解释这个词。

在“Prolog 中的编程(第 5 版)”(Clocksin & Mellish 2003)中,它只是在 p.1 上说。第188话

给定谓词的子句集合称为过程

关于Prolog 文本的注释

“Prolog 程序”(ISO 标准中未定义的术语)将是由(可能是标准的)处理器运行的一组Prolog 文本的通俗描述。

Prolog 文本还包括在顶层输入的文本,它不是 Prolog 程序,例如

?- X is 5 * 3.
X = 15.
Run Code Online (Sandbox Code Playgroud)