Prolog基础

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
/*事实fact*/ bigger(elephant,horse). bigger(horse,donkey). bigger(donkey,dog). bigger(donkey,monkey). /*规则rule*/ is_bigger(X,Y) :- bigger(X,Y). is_bigger(X,Y) :- bigger(X,Z), is_bigger(Z,Y).
Prolog-匹配(续)
匹配示例:
is_bigger(X,dog)与is_bigger(elephant, dog) p(X,2,2)与p(1,Y,X) p(_,2,2)与p(1,Y,_) f(a, g(X,Y)) 与 f(X,Z), Z=g(W, h(X)).
Prolog-目标的执行
提交一个查询意味着在要求Prolog尝试找 出正确的变量实例化,从而证明这个查询 蕴含的语句在这种变量实例化条件下是为 真的。 搜索这样的一个证明的过程通常称为目标 的执行(goal execution). 查询中的每一个谓词构成一个(子)目 标,Prolog试着一个一个满足。如果变量 在多个子目标之间共享,他们的实例化在 同一个表达式内必须是相同的。
算术运算符 * 的优先级是400,+ 的优先级是 500,因此对2+3*5求值时,Prolog先计算3*5 再将结果与2相加。
Prolog-运算符-优先级(续)
项的优先级是0,除非它的主要函数符是 一个运算符,这种情况下它的优先级等于 该运算符的优先级。例如:
3+5 500 3*3+5*5 500 sqrt(3+5) 0 elephant 0 (3+5) 0 3*+(5,6) 400
Prolog简介
编写Prolog程序相当于描述世界,使用 Prolog程序相当于向Prolog提出关于之前 描述的世界的一些问题。 Prolog适合于处理人工智能、自然语言处 理、数据库等领域的问题。
Prolog语法-概述
Prolog程序是由事实(Facts)和规则(Rules) 组成的,下面给出一个例子:
报告人:陈若愚 twinsen.ruoyu@gmail.com
内容
逻辑编程基础 Prolog简介 Prolog的语法 列表(List)的处理 算术表达式 运算符(操作符) 回溯、截断和否定 Prolog的逻辑基础 常见的Prolog工具 参考文献及资料
逻辑编程基础
逻辑编程的基本思想是将逻辑作为一种编 程语言,PROLOG就是PROgramming in LOGic的缩写。 逻辑编程将程序看作是由两部分组成的: 逻辑与控制。逻辑描述问题是什么,而控 制负责求解问题。 理想情况下,逻辑编程应该使程序员可以 只关注于说明程序的逻辑部分,控制部分 应该完全由逻辑程序系统来负责。(但是 目前还做不到这一点)
Prolog-对列表的操作
表头/表尾的模式可以用来实现列表的操 作,一般来说实现这样的操作都要使用递 归。如将两个列表连接起来:
concat_lists( [], List, List). concat_lists( [Elem | List1], List2, [Elem | List3]) :concat_lists(List1, List2, List3).
Prolog-目标的执行(续)
如果目标同某条规则的规则头部相匹配,那 么相应的变量实例化被应用在规则体中,规 则体变成了新的需要满足的目标。 规则的头部被认为是可以证明为真(provably true), true),如果它的规则体的所有谓词的合取 (conjunction,逻辑与)是可以证明为真的。 如果目标同程序中的一个事实相匹配,那么 目标的证明就完成了,匹配过程中所做的变 量实例化被返回给用户。 程序中事实和规则的出现顺序是很重要的, Prolog总是试着将当前目标与找到的第一个 可能的事实或规则头部相匹配。
Prolog语法-程序和查询
程序(Programs):一个Prolog程序就是一 个子句序列 查询(Queries):编译后,Prolog程序的执 行是通过向解释器提交查询来进行的。查 询具有和规则体一样的结构,也就是说, 查询是一个逗号分隔的谓词序列,以句号 结束,查询可以在Prolog提示符下输入, 提示符一般形式是 ??- is_bigger(elephant, donkey). ?- small(X), green(X), slimy(X).
等价谓词: = 永真和永假: true; fail 载入程序文件: consult/1 终端输出 write/1; nl/0
Hale Waihona Puke Baidu
Prolog-匹配(合一)
Prolog的执行是通过匹配、查找、回溯来 进行的。 匹配(Matching)/合一(Unification)
两个项被称作是匹配的,如果他们是相同的 (identical)或他们可以通过变量实例化 (variable instantiation)变成相同的。 实例化一个变量意味着为它赋一个固定的值。 两个变量总是可以匹配的。 需要注意的是同一个变量在一个表达式中必 须实例化为同一个值,唯一的例外是匿名变 量 _,它的每次出现都是不一样的。
Prolog语法-项
项(Terms),项有四种类型:
原子(atoms):原子通常是以小写字母开始,由 字母,数字和下划线组成的字符串,如:
elephant, b, abcXYZ, x_123
此外,单引号中的任何字符串也是原子:
‘This is also a prolog term.’
数字(numbers):所有的Prolog实现都支持整数 类型-一个数字串,部分还支持浮点型
Prolog-算术表达式-is操作符
简单的算术运算符如 + 和 * 本身都是合 法的Prolog原子。因此,表达式+(3, 5) (或写成 3+5) 是合法的Prolog项。 在没有特别告知的情况下,Prolog是不会 对上面这些表达式进行求值的。 使用 is 操作符可以解决这个问题。is只会 对它右侧的参数求值,然后同左侧的参数 进行匹配。
Prolog-算术表达式-is操作符
is操作符有两个参数,第二个参数必须是 一个合法的算术表达式,其中所有的变量 都必须是实例化的,第一个参数或者是一 个数字或者是表示数字的变量。
Prolog-运算符-优先级
运算符(Operators)具有优先级 (Precedence)和结合性(Associativity)两 个属性.这两个属性决定一个表达式应该 如何解释。 在Prolog中每个运算符都关联有一个整数 值(SWI-Prolog中取值范围是0~1200)表 示它的优先级。整数值越低优先级越高。
Prolog的一些内建谓词
Prolog提供了一些有用的内建谓词(Builtin Predicates).内建谓词和用户定义谓词 使用方式是类似的,最重要的区别在于: 内建谓词不能出现在事实的主函数符或规 则的规则头部的位置上(因为出现在这个 位置上实际上意味着修改内建谓词的定义)
Prolog的一些内建谓词(续)
is_bigger(horse,X), f(g(X, _), 7), ‘My Functor’(dog)
在函数符和参数列表的左括号之间不能有任何空 格符 组合项和原子构成了Prolog的谓词(Predicate)
Prolog语法-子句
Prolog程序是由事实和规则组成的,事实 和规则也称为子句(Clauses)
concat_lists/3还可以用来将给定的列表 分解。
Prolog-对列表的操作(续)
查询过程中可以用分号(;)来获得更多答案 最后的false表示没有其他的解了
Prolog-操作列表的内建谓词
length/2 member/2 append/3 last/2 reverse/2 select/3
Prolog-列表
列表是Prolog中最重要的数据结构之一。 列表(List)是包括在方括号中的,元素以 逗号分隔:
[elephant, horse, donkey, dog] [elephant, [], X, parent(X, tom),[a, b, c], f(22)]
列表的元素可以是任何合法的Prolog项, 也包括其他的列表。空列表写作 [ ]
Prolog-列表-表头和表尾
表头(Head)和表尾(Tail):列表的第一个元 素成为表头,剩下的部分称为表尾。空列 表没有表头。只包含一个元素的列表有一 个表头(那一个元素),表尾是空表。 另一种表示列表的方式是列出列表的表头 和表尾,这通常使用分隔符 | 来完成。
表尾(或竖线之后的部分)总是一个列表,可能是空表; 而表头是表的一个元素,它也可以是一个表,但不是 必须的。
事实(Facts):事实是以句号(.)结束的一个谓词:
○ bigger(whale, _). ○ life_is_beautiful.
事实的直观含义是我们定义了某个关系的特 定实例为真
Prolog语法-子句(续)
规则(Rules):一条规则由一个规则头部(head, 一个谓词)和一个规则体(body,由逗号分隔的 谓词序列),规则头部和规则体由符号 :- 分隔 开,规则也必须以句号结束。
Prolog语法-项(续)
变量(variables):变量是以大写字母或下划线开始, 由字母,数字和下划线组成的字符串,如:
X, Elephant, _4711, X_1_2, MyVariable, _
单独的一个下划线,表示匿名变量,用来表示我 们不关心的变量,匿名变量的每次出现都是不 同的。 组合项(compound terms):组合项是由函数符 (functor,一个Prolog原子)和一些包含在括号中、 由逗号分隔开的参数(arguments,Prolog项)组成 的。
Prolog简介
Prolog是一种声明式/描述式(Declarative)的 编程语言,与常见的命令式(Imperative)编程 语言有着本质的不同。 When implementing the solution to a problem, instead of specifying how to achieve a certain goal in a certain situation, we specify what the situation(rules and facts) and the goal (query) are and let the Prolog interpreter derive the solution for us. 也就是说,我们告诉Prolog问题是什么,而 不用关心问题是如何解决的。
○ is_smaller(X, Y) :- is_bigger(Y, X). ○ aunt(Aunt, Child) :sister(Aunt, Parent), parent(Parent, Child).
规则的直观含义是如果我们(Prolog系统)能够证 明所有规则体中的表达式(子目标, subgoals)为 真,那么规则头部表达的目标(goal)就为真。
Prolog-目标的执行(续)
有时有不止一种方法来满足当前目标。 Prolog选择第一个可能(由程序中子句出 现的顺序决定),记录下其他的可能性。如 果在某一点上失败了,程序返回,并尝试 另一种可能性。这个过程叫做回溯 (backtracking).
Prolog-目标的执行(续)
查询is_bigger(elephant,W)作为初始目标 搜索程序中的子句,Prolog试图将 is_bigger(elephant,W)同第一个可能的事实或规 则头部相匹配。 is_bigger(X,Y) :- bigger(X,Y). 可以匹配,需要实例化变量:X = elephant, Y = W 变量实例化作用到规则体上,也就是说 bigger(X,Y).变为了bigger(elephant,W).成为了新 的目标。 Prolog再一次将新目标同事实或规则头部匹配, 显然,目标同事实bigger(elephant,horse).匹配。 需要实例化变量: X = elephant, W = horse.当前 目标成功。得到一个解 W = horse
相关文档
最新文档