简介:
Prolog语言是一种以一阶谓词为基础的逻辑性语言(Programming in Logic)
Prolog语言以一阶谓词逻辑的Horn子句集为语法,以Robinson的消解原理为工具,加上深度优先的控制策略而形成的人工智能通用程序设计语言
特点:
① 是一种描述性语言。只需要告诉 “系统做什 么” ,不要告诉系统 “如何做”
② 数据与程序的统一表达。提供一种统一的符 号结构 “项” ,数据与程序都是由项组成
③ 自动实现模式匹配与回溯。这是人工智能中最常 用的两项操作,Prolog自动实现这些操作
④ 程序易于编写与阅读。它是面向人的自然语言
⑤ 语句句型少,语法简明。只有三种句型
基本内容:
1 项
符号说明:
“ ::= ” 表示“ 定义为 ”
“ | ” 表示 “ 或 ” ,可选
“ { } ” 表示 “ 重复或者出现多
项的定义:<项>::=<常量>|<变量>|<复合项>
常量
<常量>::=<原子>[<数>
<原子>::=
<标识符原子>|<字符串原子>|<特殊原子>
标识符原子:
命名:用小写字母或者小写字母开头的小写字母数字串
用途:用于标识对象的名字、谓词(对象间的关系)或函数名
例: john, marry, classmate, teacher
字符串原子:是用引号括起来的符号串
特殊原子:指一些特殊符号,如+、-、*、/等
变量
用于表示暂时不能命名或者不需要命
名的对象,用大写字母开头
特殊变量:空变量,记作: “_“
含义:我们对问题的某一个变量的值不关心
复合项
由一组其它对象组成的单个对象
<原子>(<项>{,<项>} |
<项><原子><项>{己原子><项>}
例: 函数项: like(john, apple)
表: [sa, sb], [1,2,3]
表达式: (12+59)*49-96
2 Prolog中的语句
Prolog中的语句分成三种形式:
① 事实:P.
含义:无条件成立,恒为真
例:like( monkey, banana)
② 规则: P :- P1 , P2 , … , Pn .
“ :- ” 表示“蕴涵”
“ ,” 表示“合取”
含义:若 P1 , … , Pn均为真时,P为真
③ 问题(目标)
Goal
Q1,Q,.…. ,Qm .
含义:待回答的问题,即Q1,.…. ,Qm同时为真吗?
从消解角度来看:
①(事实)中,P是Horn子句
②(规则)可以表示为 P1∧P2∧…∧PnÞP 可以转化为 ~P1∨~P2∨…∨~Pn∨P 也是Horn子句,并受全称量词约束
③(问题)是 Q1∧…∧Qm 受存在量词约束,取非后 ~Q1∨…∨~Qm 受全称量词约束,是Horn子句
Prolog三种形式的语言都是Horn子句 问题求解就是Horn子句集消解
3 表结构
表:若干个元素的有序序列
表中的元素:常量、变量、项、表
表用“[ ]”来表示,元素之间用逗号或者空格分开
例: [1, 2, 3] [a, b, c, d]
用符号“ | ”来划分表头(第一个元素)和表 尾(其余元素)
特例: 当只用一个元素时,表尾为空 空表(无元素),既无表头又无表尾
例: P([the, cat, sat, down]).
?- P([ X | Y ]). 答案:X=the, Y=[cat, sat, down]
?-P([ X , Y | Z ]). 答案:X=the, Y=cat,Z=[sat, down]
4 Prolog程序的结构
Prolog的程序分为两部分: 前提部分:所有事实和规则。问题部分:目标子句序列。
注意: 这两部分不能颠倒。必须前提部分写在前 面,问题部分写在后面
说明: 实际运行中,要逐个试探(搜索),失败 则要回溯,成功也要回溯(求出所有解)
Prolog的实现方法主要是:
匹配与回溯 匹配:合一过程、消解过程
回溯:搜索,而且是深度优先搜索
关于匹配的几点说明:
第一、 一个变量被置换后,代入了另一个项, 则称该变量为实例化的变量
第二、一个未实例化的变量可以与任何项匹配:
① 若与另一个未实例化的变量匹配,则视为同一变量,两者共享
② 若与另一个实例化的变量匹配,也变成了实例化的变量,且两者同值
③ 若与常量匹配,也变成了实例化变量,并取常量的值
第三、常量只能与相同的常量匹配
第四、实例化的变量与另一个实例化的值相同的变量匹配,也可以与另一个未实例化的变量匹 配,使另一个变量实例化,且约束值相同
5 常用内部谓词
内部谓词:Prolog系统本身定义的一些基本谓词
注意:可以直接使用,用户不能修改
①算术运算
算术表达式由操作数(数、变量)、操作符和括号组成
算术运算符号: “+、-、 * 、/”(加减乘除)
优先级:与通常的数学运算一致 形式:中缀:X+Y*Z 前缀:+(X, *(Y,Z))
②比较谓词
eq(X, Y) X=Y
ne(X, Y) X<>Y
gt(X, Y) X>Y
ls(X, Y) X<Y
对于 “= 、<> ” , X,Y 可以取 常量 变量 谓词 表
对于“=”(赋值与比较)的几点说明:
第一、当一个变量已经实例化,则可以与任意未实例化的变量相等,且将其实例化((赋值功能)
第二、两者均未实例化,eq(X,Y)恒为真,并视为同一变量
第三、均以实例化,由当前值来决定
第四、如果为表,要求对应的元素相等,才为真
第五、如果是谓词,谓词同名,变元个数相等, 对应的变元相等
③输入输出谓词
第一、write(X):向输出设备输出实例化结果
第二、read(X): 当 X 未实例化时,输入一个项 当 X 在输入前已经实例化,则读入项将与 X 匹配,根据匹配的成功与否,决定其真假值
④谓词cut与fail(特殊谓词):
cut ( ! ):禁止回溯
fail: 强迫回溯
关于cut的几点说明:
第一、只允许作为一个子目标出现在程序中
第二、第一次遇到它时,总是立刻被满足,但是不能被重新满足
第三、用户可以使用它来控制回溯方式,切断一些不必要的回溯,提高程序运行效率
关于fail的说明:
作为一个子目标,使Prolog程序运行到fail,必定引起回溯
6 Prolog程序设计步骤
第一、说明事实:说明与待求解的问题有关的事实。例如,人物事及相互关系,对应于叙述性知识
第二、定义规则:定义个体及其相互关系的推理规则,反映与待求解问题有关的过程性知识
第三:确定目标(问题)_:提出待求解的问题或者确定逻辑推理的目标
程序的一般结构(组成部分)
Visual Prolog程序包括三到四个基本程序段:
第一、域段:说明谓词变量的域(类型)
第二、谓词段:说明非标准谓词(用户自己的 谓词)
第三、子句段:核心部分,可以写出事实与规则
第四、目标段:设置内部目标
域段(domains) Prolog语言中的域用于区分不同变量类型的数据 相当于其它高级语言中的数据类型
基本标准域有:
char: 用单引号括起来的单个字符,例如, ’a’
integer:整数,范围为32767到-32768
real: 实数,例如,86.72,5.1e+2
string: 用双引号括起来的字符序列 例: “I am from Nanjing”
symbol:有两种形式:
以小写字母开头的字母、数字和下划线 组成的序列
用双引号括起来的字符串序
表
Prolog中表示成下列形式:
integerlist = integer *
“integer”说明表中元素的类型
”*“告诉编译系统,这是一张表
例
domains
title , author = symbol
pages = integer
例
domains
title , author = symbol
pages = integer
注:每一个说明的最后无句号 “ . ”
谓词段(predicates):说明用户自己定义的谓词。说明谓词变元的域
谓词名: 由小写字母开头,由字母、数字和下划线组成(标识符原子)
谓词变元的类型 :标准域 。域段中说明的其它域
子句段(clauses) 由事实与规则组成
说明:每一个事实或规则后面必须有句号“ . ”
例:
clauses
likes(tom, football).
classify(X, negative):- X<0. classify(X, positive):- X>0.
classify(X, positive):- X>0.
目标段(goal) 必须书写一个目标段,作为源码的一部分(内部 目标) 外部目标
例
Goal
likes(tom, X).
注释:
多行注释:/* …… */ (C/C++中采用的符号)
单行注释:% (Matlab中采用的符号
Visual Prolog 程序的基本结构:
domains
……(说明变量类型,无句号)
Predicates
….. (说明谓词,无句号)
clauses
….. (程序段,必须有句号)
goal
…… (目标或问题,必须有句号)