Prolog教程6-规则
浙教版高中信息技术选修5人工智能初步用Prolog求解简单问题
read_one_char. goal
read_one_char. clauses
read_one_char:-readchar(C). write(C) read_one_char.
2.汉诺塔(Hanoi)问题求解 (1)问题描述。相传古代东方有一座寺庙,庙内有三根座桩,第一 根本桩上叠有一摞64个中心带孔ห้องสมุดไป่ตู้从上到下直径自小到大各不相同的圆 盘片。这些圆盘片叠成塔状,即越上面的盘片直径越小。要把这64个盘 片从第一根座桩搬到第三根座桩上(如图),搬动的规则如下: ①一次只能从有盘片的座桩上取走一个盘片; ②被取走的盘片必须马上放到某一根座桩上; ③任何一根座桩上如果有一个以上盘片,则这些盘片必须呈直径上 小下大的塔状。 向应如何搬动?
3
实践体验
1.实验名称:调入并运行Hanoi程序。 2.实验要求:将Hanoi程序调入到Turbo Prolog2.0集成开发环境进 行编译连接和运行程序。 3.实验步骤: (1)在计算机上找到并运行Turbo Prolog2.0集成开发环境。 (2)将Hanoi程序调入到编辑区(利用Load菜单项,在弹出对话框 内输入“hanoi.pro”)。 (3)编译和连接Hanoi程序。 (4)运行Hanoi程序,并观察记录运行结果。 4.结果呈现:改变Hanoi程序中盘子的数目,并记录运行结果。
用Prolog求解简单问题
1
基本算术运算
加减、乘除是基本算术运算能不能用Prolog求解算术问题呢?答案 是肯定的。Turbo Prolog不仅提供了加减乘除四种运算,还提供了取模 运算。运算符号依次为 + - * /和mod,我们可以利用这些运算符进行 数值计算。
Prolog语言(耐心看完-你就入门了)剖析
名的对象,用大写字母开头
2024/7/16
特殊变量:空变量,记作:“_” 含义:我们对问题的某一个变量的值不关心
2024/7/16
<项>::= <常量> | <变量> | <复合项>
<复合项> ::=
<原子>(<项> { , <项> })|
<项> <原子> <项> { <原子> <项> }
也是Horn子句,并受全称量词约束
2024/7/16
③(问题)是 Q1∧…∧Qm
受存在量词约束,取非后 ~Q1∨…∨~Qm
受全称量词约束,是Horn子句
2024/7/16
Prolog三种形式的语言都是Horn子句 问题求解就是Horn子句集消解
2024/7/16
3 表结构
表:若干个元素的有序序列
2024/7/16
项的定义: <项>::= <常量> | <变量> | <复合项>
2024/7/16
<项>::= <常量> | <变量> | <复合项>
<常量>::=<原子> | <数> <原子> ::=
<标识符原子> | <字符串原子> | <特殊原子>
2024/7/16
标识符原子 命名:用小写字母或者小写字母开头的小写字母
不能被重新满不必要的回溯,提高程序运行效率
2024/7/16
PROLOG语言入门
PROLOG语言入门简介PROLOG语言是一个非常有趣的计算机语言。
它完全不同于我们已经很熟悉的其它计算机语言、例如BASIC、FORTRAN、C等。
主要由于现在的计算机硬件能力的限制,使得PROLOG语言没有得到更广泛的流行。
但是未来随着计算机硬件技术的发展,PROLOG语言将会发挥更大的作用。
尤其是通过PROLOG语言的学习,我们对计算机语言的本质会有更多的了解。
虽然对许多人来说,PROLOG语言比较陌生。
但是PROLOG语言很容易入门,人们很容易感受到它的魅力。
本书在多年从事相关教学的讲义的基础上形成。
本书没有试图写成PROLOG语言程序设计的指导书,而是着重在于于介绍PROLOG的有趣性,引导读者尽快进入PROLOG世界。
同时,尽量利用BASIC、FORTRAN、C等大家熟悉的语言的例子,说明PROLOG与这些语言的区别,以加深读者对PROLOG的理解。
因此,本书适合于PROLOG的初学者,而对于那些已有相当基础、希望利用PROLOG开发应用程序的读者,则可以选择其它更加全面的书籍,例如本书末尾所推荐的那些书籍。
目录1引言2为什么有PROLOG3什么是PROLOG ?4最简单的PROLOG程序5PROKOG运行方式6关于Visual PROLOG ?7Visual PROLOG的运行方式8PROKOG入门9规则与事实10递归11表12引言首先,介绍一种常见的扑克牌游戏。
该游戏方法为:“随意抽出4张扑克牌。
然后利用加、减、乘、除方法,对这个4张扑克牌所代表的4个数进行四则运算。
要求最后的运算结果为24。
注意,每个数只能在运算中出现1次,且必须出现1次。
”例如,如果所抽取的4张牌所代表的4个数分别为:2,4,7,9。
则可以采用如下运算方法:2 * 4 + 9 + 7 = 24有时,同一数字组合,可能存在好几种四则运算方法。
游戏时,可以规定先找到相应的四则运算方法的人获胜。
有些数字组合比较容易计算,例如6,6,6,6。
prolog教程第6章
谓词mail::sendMessage以person(接口)和string作为参数。
2004.11.3
AI程序设计
12
第二部分:第6章 类与对象
6.6 多重实现
我们可以创建多个完全不同的类,这些类都创建person对象。我们 只需声明和实现更多的可构造person对象的类。这些类的实现可以 有很大区别,比如,可以创建一个将person存放在数据库中的类。 以下便是这样一个类的声明:
2004.11.3
AI程序设计
3
第二部分:第6章 类与对象
6.1 对象模型
接口只定义对象的类型;而对象由类产生。一个类包含类的声明和 类的实现。一个创建person对象的类可以这样声明: class person_class : person constructors new : (string Name). end class person_class 这是一个名为person_class 的类的声明,可以由person_class类 构造person类型的对象。这个类有一个名为new的构造函数,给 new一个Name就能创建一个对象(属于person类型)。
7
第二部分:第6章 类与对象
6.2 类实体
注意,公共可访问类谓词在类声明中进行声明,而公共可访问对象 谓词在接口中声明。这个规则没有例外:不可能在类声明中声明对 象谓词,也不可能在一个接口中声明类谓词。 这个谓词需要在类实现中定义。此外,还需要一个事实来存储计数 值。这个事实必须是一个类事实,即它为所有对象所共享。在一个 类的实现里,可以声明并定义私有对象实体以及私有类实体。声明 类实体时,在相关的声明段前加关键词class。
都能引用具有事实变量的那个特例。我们把这种谓词称为对象谓词,
Prolog基础
Prolog的一些内建谓词
Prolog提供了一些有用的内建谓词(Builtin Predicates).内建谓词和用户定义谓词 使用方式是类似的,最重要的区别在于: 内建谓词不能出现在事实的主函数符或规 则的规则头部的位置上(因为出现在这个 位置上实际上意味着修改内建谓词的定义)
Prolog的一些内建谓词(续)
Prolog-算术表达式-is操作符
is操作符有两个参数,第二个参数必须是 一个合法的算术表达式,其中所有的变量 都必须是实例化的,第一个参数或者是一 个数字或者是表示数字的变量。
Prolog-运算符-优先级
运算符(Operators)具有优先级 (Precedence)和结合性(Associativity)两 个属性.这两个属性决定一个表达式应该 如何解释。 在Prolog中每个运算符都关联有一个整数 值(SWI-Prolog中取值范围是0~1200)表 示它的优先级。整数值越低优先级越高。
Prolog-目标的执行(续)
如果目标同某条规则的规则头部相匹配,那 么相应的变量实例化被应用在规则体中,规 则体变成了新的需要满足的目标。 规则的头部被认为是可以证明为真(provably true), true),如果它的规则体的所有谓词的合取 (conjunction,逻辑与)是可以证明为真的。 如果目标同程序中的一个事实相匹配,那么 目标的证明就完成了,匹配过程中所做的变 量实例化被返回给用户。 程序中事实和规则的出现顺序是很重要的, Prolog总是试着将当前目标与找到的第一个 可能的事实或规则头部相匹配。
is_bigger(horse,X), f(g(X, _), 7), ‘My Functor’(dog)
在函数符和参数列表的左括号之间不能有任何空 格符 组合项和原子构成了Prolog的谓词(Predicate)
prolog简单教程
likes(tom,wine). likes(tom,book).
* 程序内goal则是找到一个解就停止搜索了 例:predicates likes(symbol,symbol) goal likes(tom,W),write(―tom likes ‖,W,‖\n‖). clauses likes(tom,food). likes(tom,wine). 程序内goal 运行结果 likes(tom,book). Dialog Tom tom likes food
3、影响回溯的手段——fail和cut
注意:Turbo Prolog ―外Goal‖ 和“程序内goal‖ 有“勤” “懒” 之分 * 对话框中输入的外Goal主动找出全部解并报告有几个 外Goal运行情况 Solutions Dialog 例:predicates Goal:likes(tom,What) likes(symbol,symbol) What=food What=wine clauses What=book likes(tom,food). 3 Solutions
•
表(List)
——
•
表由方括号与元素组成,元素又可是一个表。 非空表可用[x|y]表示,x—表头 y—表尾 • 例: [a,b,c] [a | [b,c]] 表头 a
表尾 [c]
[c]
[b | [c]]
[c | []]
表头 b 表尾 [c]
表头 c 表尾 []
空表无表头!
匹配与回溯
GOAL(目标)
predicates 运行 thief(symbol) Dialog likes(symbol,symbol) Goal : may_steal(john,What) may_steal(symbol,symbol) What=food clauses What=wine thief(john). 2 Solutions likes(tom,food). likes(john,wine). likes(john,X):- likes(tom,X). may_steal(X,Y):- thief(X),likes(X,Y).
Prolog开发专家系统入门
Prolog开发专家系统入门什么是专家系统,以及它的基本设计方法和技术,详细介绍了使用prolog设计专家系统的技术。
什么是专家系统专家系统是人工智能最重要的应用之一,它的目的是让电脑在某种程度上帮助或者替代某个领域的专家解决问题。
例如医疗诊断系统、投资风险分析系统、家居设计系统等等。
一个典型的专家系统的构成方式如下图所示:Domain Expert就是某个领域的专家,他提供原始的知识。
Knowledge Engineer 是把专家的知识翻译成电脑所能够识别的知识的工程师。
某领域的专家把他所知道的知识告诉knowlegde engineer以后,由knowlegde engineer对这些知识进行处理,最后做成知识库knowledge base。
System Engineer是设计专家系统的程序员,他的主要任务是编写专家系统的推理机构inferface engine,和用户界面user interface。
用户使用用户界面和专家系统打交道,他和专家系统之间的交流的一些信息由工作空间working storage储存。
推理机构根据用户信息和知识库中的信息为用户提供服务。
在设计专家系统时候有目标驱动和数据驱动两种方式。
下面我们通过实例来说明一下如何使用prolog编写目标驱动的专家系统。
一个可以识别鸟类的专家系统这个系统的目的是通过用户对某种鸟类的描述,推断出用户描述的是何种鸟。
由于prolog的规则就是一种非常好的表达知识的方法,而其内建的回溯功能和模式匹配功能则是很好的推理机构,所以使用prolog来编写这样的专家系统是再容易不过的了。
首先让我们来看看如何是使用prolog的规则来表达知识吧。
我们可以从鸟类专家那里得到如下的知识:如果某种鸟是属于信天翁科,并且其颜色是白色的,那么这种叫就是laysan信天翁。
(我是翻译的外文教材,所以这里关于鸟类的知识翻译的并不是太准确)当然我们要用英语来表这个规则:IFfamily is albatross andcolor is whiteTHENbird is laysan_albatross如果使用prolog的规则来表达就是:bird(laysan_albatross) :-family(albatross),color(white).同样我们还可以加入下面的规则:bird(laysan_albatross):-family(albatross),color(white).bird(black_footed_albatross):-family(albatross),color(dark).bird(whistling_swan) :-family(swan),voice(muffled_musical_whistle).bird(trumpeter_swan) :-family(swan),voice(loud_trumpeting).为了能够让这些规则能够分辨不同的鸟类,我们必须储存关于某种鸟的特定的信息。
Prolog语言基础知识
Prolog语言基础知识一.数据结构PROLOG语言与其他任何一种计算机高级语言一样,有其定义的数据结构。
下面将介绍PROLOG语言的基本数据结构。
1.常量常量是数据结构的基本组成部分,用来对特定对象及关系的命名。
在PROLOG语言中,合法的常量有:(1)整数,一个纯数字串,例 182 000,581 202。
(2)原子,分为两种:1)标识符:以小写字母开头的,包含字母、数字、下划线的串,例aBC12,is_。
2)符号:PROLOG语言规定的符号集的非空序列,例?、-、=。
若原子用单引号厂(‘ ’)括住,则可含有任何字符。
(3)字符集ab...z2.变量变量是用来表示还无法知道且需要PROLOG程序来确定的客体。
变量用变量名表示,变量名与标识符相似,所不同的是以大写字母或下划线开头。
例Variable,_ansure。
PROLOG语言中有一个特殊的变量,不需要知道它是什么以及具体名字,只是表示留出一位置,称为匿名变量。
用单一的下划线(_)来表示。
比如只想知道是否有人喜欢跳舞,但不需知道这个人的名字,这时就可以用匿名变量。
3.结构结构是PROLOG语言中的第三类数据结构;用于构造PROLOG数据对象。
一个结构是一个单一的客体,它由一个函子和一个或多个称为分量的项的序列组成。
其书写形式为函子(分量1,分量2,…,分量n)其中的分量也可以是结构。
例如可用结构描述事实"Mary住zhongshan路120号":person(mary,address(zhongshan,120)).此例中address是一个具有两个分量即路名和门牌号的结构。
该结构是作为事实的一个分量出现,它将作为关系中的一个客体来对待。
当然,结构中的分量也可以是结构,如上例可写成:person(name(mary),address(street(zhongshan),number(120))).其中name,address,street,number均为结构。
Python人工智能中逻辑编程语言Prolog基础
逻辑编程语言Prolog基础## 什么是Prolog?我们先给出一个例子.man(jack)man(dylan)happy(jack)playGuitar(jack) :- happy(jack)运行:?- man(jack)Prolog回答:yes再运行:?- playGuitar(jack)Prolog回答同样是:yes上面的例子展示的就是Prolog程序和它的运行以及运行结果.Prolog是一种基于模式匹配,树型结构和自动回溯等机制的面向目标的编程语言。
这几个机制构成了灵活而强大的编程框架. Prolog尤其适用于包含结构化对象以及这些对象之间的关系的问题. 例如,prolog可以依据空间关系和一般规则进行推理. 所以,对于人工智能和非数值编程,prolog是一种强大的语言。
字面上看,Prolog意思是以逻辑(logic)编程. 此观念来自于20世纪70年代初期。
早期开发者有Robert Kowalski, Maarten Van Emden 和Alain Colmeraner.在低级编程语言中,程序员往往指定计算机如何做一件事(How型语言). 在高级编程语言中,程序员给计算机指定需要做什么. 编程语言是从低级向高级演化的. Fortran, C, Lisp,Python,Java等几乎所有语言都属于How型语言. 相反地,Prolog舍弃了“指定计算机如何做事”这样的传统. 它鼓励程序员描述问题,而不是描述解决问题的详尽的方式. Prolog 为我们提供了另外一种编程的方式. 它背后的科学是人工智能. 我们可以从中学习到一些解决问题的观念,比如问题化简,回溯链,各种搜索技术等. Prolog可以让我们将抽象概念具体化. 编程者只需要指定什么是已知的,什么问题需要解决,即编程人员更关注事实而不是算法.## Prolog语法Prolog程序由语句(clauses)构成。
语句又由对象和关系构成. 例如,上例中的 man(jack)man就是一种关系,它可以指明对象的性别; jack就是该关系中的对象.运行Prolog程序的方式很简单: 向程序提问. 语法如下:?-关系表达式.其中,?- 是提示符.后面有个结束符(.).例如:?- happy(jack).写语句时,常需要用到符号”:-”.:- 表示”如果”,或“蕴含于”.例如:playGuitar(jack) :- happy(jack)上面代码的意思是:如果jack高兴,那么jack就要弹吉他.:- 的右边叫主体;:- 的左边叫规则头.下面我们通过一个例子来看Prolog的机制,从中可见多个重要的概念. 例如, 甲(a)是乙(b)的父母,可写为:parent(a,b)parent是关系名称; a,b 是该关系的参量.## Prolog举例下面我们以中国近代著名的家庭义宁陈宝箴家的家谱为例,来看看Prolog的运行机制. 家谱如下:graph TB陈宝箴 --> 陈三立黄淑贞 --> 陈三立黄淑贞--> 陈三畏陈三立 --> 陈师曾陈三立 --> 陈寅恪陈师曾 --> 陈封怀```在以下代码中,我们将人名用其拼音首字母的小写代替. 人名和拼音首字母的对应如下:陈宝箴 cbz黄淑贞 hsz陈三立 csl陈三畏 csw陈师曾 csz陈寅恪 cyk陈封怀 cfh整个家谱由下列prolog程序给出:parent(cbz,csl).parent(hsz,csl).parent(hsz,csw).parent(csl,cyk).parent(csl,csz).parent(csz,cfh).此程序包含6个语句. 每个语句声明了一个parent关系. 当此程序与prolog系统交互时,prolog就parent这一关系提问. 例如,陈三立是陈寅恪的父亲吗?实现代码如下: ?- parent(csl,cyk).当prolog发现这是一个已经声明的事实,因此prolog会给出答案:yes我们也可问程序:“陈三畏是陈师曾的父母吗?”?-parent(csw,csz)prolog回答:no因为程序并未提及陈三畏是否为陈师曾父母.当然我们也可问:“黄淑贞是Alice的父母吗?”?-parent(hsz,alice)Prolog不会判断alice是中国人名还是外国人名. prolog仅仅从程序中的关系来做判断. 因为并未听过”ALice”这个人,因此它果断给出结果:no但是,如果我们问“谁是陈三畏的父母?”这样的问题时,prolog确实可以给出我们一个值,而不仅仅是yes或no.?- parent(X,csw).Prolog给出的回答是X=hsz同理,我们可以问:”谁是陈三立的子女?“?- parent(csl,X)输出结果为:X=csz这里,我们只得到一个回答. 可是,从家谱中给我们可以发现看到陈三立的子女不止一个,所以我们期待能看到所有的结果的操作. 这时,我们输入一个分号,那么Prolog就会给出其余的答案:X=cyk由于上图中没有给出陈三立更多子女的信息,所以,如果我们试图知道更多答案,Prolog 会回答“no”.考虑一个更复杂的情形. 我们可以问诸如”谁是谁的父母?”这样的问题. 提炼一下该问题,它就变为:找出X,Y,使得X是Y的父母. 用Prolog表示为:?- parent(X,Y).Prolog会找出所有的”父母-子女“对.Prolog一次只显示一个解,直到所有的解被找出. 结果如下:X=cbzY=csl;X=hszY=csl;X=hszY=csw;X=cslY=csz;...我们还可以问更加复杂的问题. 比如,”谁是陈封怀的祖父母?“这个关系我们命名为grandparent. 显然,我们的程序中没有grandparent这一关系. 虽如此,我们可以将这一问题的解决划分为两步.让每一名学员高薪就业第一步,谁是陈封怀的父母?设为Y.第二步,谁是Y的父母?设为X.Prolog将这一复合问题写出两个简单语句序列:?- parent(Y,cfh), parent(X,Y).答案为:X= cslY= csz复合语句可以理解为:找出X,Y,使得这两个条件成立:parent(Y,cfh) 和parent(X,Y). 这两个条件的顺序并不重要, 所以这个复合问题也可以写成?- parent(X,Y), parent(X,cfh).而结果不会改变.我们再举最后一例. 陈寅恪和陈师曾有共同的父母吗?同样,我们可以由两步得出:第一步,谁是陈寅恪的父母,设为X.第二步,X是陈师曾的父母吗?代码如下:?- parent(X,cyk), parent(X,csz).结果如下:让每一名学员高薪就业 X=csl从上面的例子中,我们看出了Prolog程序的一些特征。
逻辑型程序设计语言PROLOG详细教程
逻辑型程序设计语言PROLOG教程2.3. 1逻辑型程序设计语言PROLOGPROLOG的语句PROLOG语言只有三种语句,分别称为事实、规则和问题。
1.事实(fact)格式: <谓词名>(<项表>).功能一般表示对象的性质或关系。
其中谓词名是以小写英文字母打头的字母、数字、下划线等组成的字符串,项表是以逗号隔开的项序列。
例如:student(john).like( mary ,music).表示“约翰是学生”和“玛丽喜欢音乐”。
2. 规则(rule)格式:<谓词名>(<项表>):-<谓词名>(<项表>){,<谓词名>(<项表>)}.功能: 一般表示对象间的因果关系、蕴含关系或对应关系。
其中“:-”号表示“if”(也可以直接写为if),其左部的谓词是规则的结论(亦称为头),右部的谓词是规则的前提(亦称为体),{}表示零次或多次重复,逗号表示and(逻辑与),即规则的形式是一个逻辑蕴含式。
例如:bird(X):-animal(X),has(X,feather).grandfather(X,Y):-father(X,Z),father(Z,Y).第一条规则表示“如果X是动物,并且X有羽毛,则X是鸟”;第二条规则就表示“X是Y的祖父,如果存在Z,X是Z的父亲并且Z又是Y的父亲”。
3.问题(question)格式: -<谓词名>(<项表>){,<谓词名>(<项表>)}.功能表示用户的询问,它就是程序运行的目标。
例如:-student(john).-like(mary,X).2.3. 2 PROLOG程序PROLOG程序一般由一组事实、规则和问题组成。
问题是程序执行的起点,称为程序的目标。
例如下面就是一个PROLOG程序。
likes(bell,sports).likes(mary,music).likes(mary,sports).likes(jane ,smith).friend(john,X):-likes(X,reading),likes(X,music).friend(john,X):-likes(X,sports),likes(X,music).-friend(john,Y).可以看出,这个程序中有四条事实、两条规则和一个问题。
VisualProlog实验(DOCX页)
实验一Visual Prolog运行环境实验(1学时)一、实验目的1、了解PROLOG解释器;2、掌握PROLOG语言中常量、变量的表示方法;3、掌握利用PROLOG进行事实库、规则库的编写方法。
二、实验要求1、熟悉Visual Prolog运行环境,包括硬件与软件环境;2、学习示例程序,分析其功能;3、写出Example 1、Example 2、Example 3示例程序的功能;4、利用PROLOG进行事实库、规则库的编写,并在此基础上进行简单的询问。
三、实验设备计算机,Visual prolog教学软件。
四、实验内容及步骤(一)实验内容:1、熟悉Visual prolog的运行环境,包括所用的机器的硬件与软件环境;2、学习使用Visual prolog,包括进入Prolog主程序、编辑源程序、修改环境目录、退出等基本操作;3、学习Visual prolog的简单程序结构,掌握分析问题、询问解释技巧;4、了解PROLOG语言中常量、变量的表示方法;5、利用PROLOG进行事实库、规则库的编写,并在此基础上进行简单的询问。
(二)实验步骤:1、启动Windows 2000操作环境;2、安装Visual Prolog集成开发环境;3、双击桌面图标或者找到Visual Prolog可执行文件所在目录双击图标,启动Visual prolog集成开发环境;4、打开Project菜单,选择New Project菜单项,将工作目录修改为你要保存到的文件夹,例如,c:\11,给出工程文件名;5、打开Option菜单,选择Project菜单项打开下拉菜单,选择Compiler Options项,按下图中显示进行设置;6、从工程界面中选择“new”按钮或者从file菜单中选择“new”菜单项,弹出一个界面,将所有的复选框都去掉,进入Visual Prolog的程序编辑界面;7、将下面的Example 1编辑到编辑界面里面,Project菜单里面的Test goal菜单项或者直接点击菜单栏中的Test Goal按钮执行程序。
Visual_Prolog概述
2004.11.3
AI程序设计
1
第4章
第二部分:第4章 Visual Prolog概述
Visual Prolog概述
4.1 Visual Prolog 6概述 4.2 Visual Prolog 6基本特性 4.3 创建项目 4.4 建立项目 4.5 浏览项目 4.6 开发项目 4.7 调试项目
本章小结 习题四
10
第二部分:第4章 Visual Prolog概述
4.2 Visual Prolog 6基本特性
• 用非决定性搜索将符号数据类型、事实数据库和模式匹配结合起来, 这样使得Visual Prolog非常适合于处理复杂的结构化知识。
• 除了谓词值和对象,所有的Visual Prolog数据都有一个人性化的可 读文本表示,它可以被写入并返回到程序。
第二部分:第4章 Visual Prolog概述
2004.11.3
图4.1 项目设置选项对话框
AI程序设计
18
4.3 创建项目
第二部分:第4章 Visual Prolog概述
• 我们选择项目名为tut01。项目名亦作为将要产生的目标文件名。在 此例中,目标文件是一个exe文件,故目标文件名将是tut01.exe。 选择UI策略为GUI,即该程序是一个GUI程序,带有图形用户界面。
2004.11.3
AI程序设计
3
4.1 Visual Prolog 6概述
第二部分:第4章 Visual Prolog概述
• 经过持续不断的努力和对用户需求的深入考察,Visual Prolog已经 增加了如下功能: – 一个独特的对象系统 – 多线程机制 – Unicode支持 – 改进的DLL支持 – 改进的函数支持 – 改进的异常处理 – 其他更多功能等
实验一 Prolg简介及简单程序设计
实验一Prolog简介及简单程序设计一、实验目的1、掌握Visual Prolog软件并调试运行程序;2、熟悉Prolog语言的基本结构;3、理解Prolog程序的推理机制;4、学会用Prolog语言编写简单的程序。
二、实验原理1、Visual Prolog语言的基本知识及开发环境。
2、谓词逻辑表示知识的方法、事实和规则的表示方法。
3、简单逻辑推理机制。
三、实验设备1、计算机PC 一台2、Visual Prolog 5.2四、实验内容和步骤1、熟悉Visual Prolog软件的使用;新建文件夹:命令“File | New”,产生一个标题为"NONAME"的文件;运行程序:GOAL write("Hello world"),nl. Project | Test Goal或Ctrl+G。
2、运行程序1,找出程序中的错误并进行修改;记录执行目标1、2所得的结果;完成练习1(Exercises1)中的内容。
3、运行程序2,记录执行结果;思考:若要问目标2、3、4时,如何来修改程序(选做);完成练习2(Exercises2)中的内容。
4、运行程序3、4,记录执行结果;理解程序中普通变量和匿名变量的使用方法。
5、运行程序5,记录执行结果;执行目标2、3并记录其结果;理解复合目标(合取和析取)的表示方法。
6、自己编写一个简单的Prolog程序。
五、附录程序2:predicatescan_buy(symbol,symbol) - nondeterm (o,o) person(symbol) - nondeterm (o)car(symbol) - nondeterm (o)likes(symbol,symbol) - nondeterm (i,i)for_sale(symbol) - nondeterm (i)clausescan_buy(X,Y):-person(X),car(Y),likes(X,Y),for_sale(Y).person(kelly).person(judy).person(ellen).person(mark).car(lemon).car(hot_rod).likes(kelly, hot_rod).likes(judy, pizza).likes(ellen, tennis).likes(mark, tennis).for_sale(pizza).for_sale(lemon).for_sale(hot_rod).goalcan_buy(Who,What).%can_buy(judy, What). %目标2%can_buy(kelly, What). %目标3%can_buy(Who, hot_rod). %目标4程序5:predicatescar(symbol,long,integer,symbol,long) - nondeterm (o,o,o,o,i)truck(symbol,long,integer,symbol,long) - nondeterm (o,o,o,o,i)vehicle(symbol,long,integer,symbol,long) - nondeterm (o,o,o,o,i)clausescar(chrysler,130000,3,red,12000).car(ford,90000,4,gray,25000).car(datsun,8000,1,red,30000).truck(ford,80000,6,blue,8000).truck(datsun,50000,5,orange,20000).truck(toyota,25000,2,black,25000).vehicle(Make,Odometer,Age,Color,Price):-car(Make,Odometer,Age,Color,Price);truck(Make,Odometer,Age,Color,Price).goalcar(Make,Odometer,Years_on_road,Body,25000)./*car(Make, Odometer, Years_on_road, Body, Cost),Cost < 25000. */ %目标合取目标2/*car(Make,Odometer,Years_on_road,Body,Cost), Cost<25000 ;truck(Make,Odometer,Years_on_road,Body,Cost), Cost < 20000.*/ %目标析取目标3。
第6章 PROLOG语言
到目前为止,PROLOG语言是两种主要的人工智能程序设 计语言之一(另一个是LISP)。本章对PROLOG语言做 一描述,并讨论几个例子,使大家了解PROLOG语言及 其特点,并能编写简单的PROLOG程序。
2020/7/27
2
第6章 PROLOG语言
6.1.1 PROLOG语言的发展 PROLOG(Programming in Logic)语言是一种以逻辑
注意1:prolog是不允许使用除了基本字符以外字符的, 上面的句子必须写成love(zhangxueyou,wanfei).,电脑 才能够真正的理解。
注意2:最末尾的“.”一定不能掉,它表示一个句子结束。
注意3:上面词汇对于电脑来说并没有真正的含义,所以 我们完全可以用 ai(zxy,wf).来表达这个关系 。
表的一般形式是[x1,x2,…,xn]表的分量可以是原子, 结构也可以是表。
其中xi(i=1,2,…,n)为PROLOG的项,一般要求同一个表 的元素必须属于同一领域。不含任何元素的表称为空 表,记为[ ]。
2020/7/27
18
第6章 PROLOG语言
例如下面就是一些合法的表。 [1,2,3] [apple,orange,banana,grape,cane] ["PROLOG","MAENS","PROGRAMMING","in logic"] [[a,b],[c,d],[e]] []
(3)表达式
PROLOG提供了五种最基本的算术运算:加、减、乘、除和取模,相 应运算符号为+、-、*、/、mod。这五种运算的顺序为:*、/、 mod优先于+、-。同级从左到右按顺序运算,括号优先。算术表达
prolog详解
Artificial Intelligence = to perceive, reason and act
– LISP/Prolog concerned mostly with reasoning – Symbolic manipulation of (model of) world
– an atom does not have a value – only one atom with any given name (no local scope, only global)
Named atoms start with lower-case letter lower– may contain letters (UPPER and lower case), numbers & underscores
Syntax of Prolog Facts
Consist of functor…
– A name of the predicate
parent mark, alex
…and arguments Arguments in (parentheses)…
– Right up against the functor
Some Predicates to Start With
?- help. ?- help(help). ?- apropos(help). ?- consult(‘family_1.pl’). ?- [‘family_1.pl’]. ?- edit(‘family_1.pl’). ?- [user]. ?- halt. % general help % help on … % help available ... % load a file % ditto % edit/reload file % enter facts interactively % exit Prolog
关于Cahn-Ingold-Prelog
关于Cahn-Ingold-Prelog 顺序规则的讨论在用IUPAC 法、CCS 法命名有机化学物时或在确定有机化合物的R S 、Z E 构型时,总要涉及有机基团的顺序大小问题。
Cahn-Ingold-Prelog 顺序规则是解决有机基团的顺序大小问题的法则[1]。
该法则简单说只有一句话: 原子序数大者为大,原子量大者为大。
但在实际使用该规则时,却有许多要注意的问题。
1 关于基团的展开问题比较基团大小时,有时需要比较多次才能确定基团的大小,对于复杂的基团,要按Cahn-Ingold-Prelog 规则展开。
如: 苯基、甲酰基。
相当于H (C)H(C)H(C)H (C)(C)H(C)COH 相当于C H O(O)(C)对于复杂基团则显得麻烦,而使用氧化数法则简单了许多,因为无论C-C,C=C,还是碳碳叁键,氧化数均是0,特别是对烃类基团使用氧化数法判断基团大小尤为方便[2]。
如:CC C C H CH 3CH 31234561234561(C,C,C);2(C,C,C);3(C,C,C);4(C,C,C);5(C,C,H);1(C,C,C);2(C,C,C);3(C,C,C);4(C,C,C);5(C,C,C);<0000000-100——————————————————————————*北京化工大学化工学院2 关于原子量大者为大原子量大者为大是指在原子序数相同的时候才能使用,如下列基团的比较:CH 2CH 2CH 2CH 3CD 2CH 2CH 3经常发现一些学生忽视了原子序数相同才能使用原子量大者为大的规则,认为后者大于前者,因为后者上连有2个氘原子。
但使用氧化数不会有这个错误出现,因为丁基的氧化数依次是:-2,-2,-2,-3; 而后者为-2,-2,-3。
3 对于分叉较多的基团,优先按原子序数大的方向比较,如:COHHCHCBrHCHClHCHCl HHFCCHCFHCHOHHBr HC BrHH>优先方向优先方向不起作用决定顺序1234S决定方向决定方向4 关于R>S 的修正[3]在立体异构体中,当判断假手性碳原子的构型或判断Z E时,会涉及到R>S 基团的问题。
用于人工智能的Prolog语言
male(bob). male(jim). female(pam). female(liz). female(ann). female(pat). sister(X,Y):parent(Z,X), parent(Z,Y), female(X), different(X,Y). different(X,Y):X<>Y.
运行
4.3 Turbo Prolog程序结构
一个Turbo Prolog程序通常包括5个部分。如下: /* 注释 */ domains 域说明 database 数据库说明 predicates 谓词说明 goal 目标说明 clauses 子句说明 /* 注释 */
1.域说明部分,说明谓词对象的数据类型。 2.数据库说明部分,包含一些数据库谓词的 定义,是说明用于动态数据库管理的谓词。 如果程序不需要动态数据库,该部分可省略。 3.谓词说明部分,定义程序中除内部谓词以 外的所有谓词。
运行
改进的sister规则:
predicates parent(symbol,symbol) sister(symbol,symbol) female(symbol) male(symbol) different(symbol,symbol) clauses parent(pam,bob). parent(tom,bob). Pat的姐妹 是谁? parent(tom,liz). parent(bob,ann). parent(bob,pat). parent(pat,jim). goal male(tom).
(5)一个Prolog 程序由一些子句(clauses)组成。每个子句用句号结束。
(6)对一个问题的回答是肯定的或者是否定的,取决于相应的目标是否满足。 在肯定回答的情况下,说相应的目标是可满足的,而且这个目标成功了。 否则,说目标不可满足,目标失败了。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实际上规则就是多层的询问。第一层由原始的目标组成,从下一层开始就是由与第一层的目标相匹配的规则的Body中的子目标组成。(这句话有点难理解,请参照下面图来分析)
每一层还可以有子目标,理论上来讲,这种目标的嵌套可以是无穷的。但是由于计算机的硬件限制,子目标只可能有有限次嵌套。
于是第一个子句的Body将变为新的目标。
2-1 CALL location(X, kitchen)
从现在起的运行过程就和我们以前一样了。
2-1 EXIT (2) location(apple, kitchen)
Thing = crackers
Room = kitchen ;
no
我们可以使用多个事实来定义一个谓词,同样我们也可以用多个规则来定义一个谓词。例如,如果想让Prolog知道broccoli(椰菜)也是可食物,我们可以如下定义where_food/2规则。
2-1 EXIT (7) location(crackers, kitchen)
表示第二层的第一个目标的EXIT过程。
我们的询问如下
?- where_food(X, kitchen).
2-2 CALL tastes_yucky(broccoli)
2-2 EXIT (1) tastes_yucky(broccoli)
1-1 EXIT (2) where_food(broccoli, kitchen)
?- where_food(X, kitchen).
X = apple ;
X = crackers ;
X = broccoli ;
no
下面将找到不好吃的椰菜。即 tastes_yucky 的 broccoli.
2-1 CALL location(X, kitchen)
2-1 EXIT (2) location(apple, kitchen)
2-2 CALL edible(crackers)
2-2 EXIT (2) edible(crackers)
1-1 EXIT (1) where_food(crackers, kitchen)
规则的工作原理
到现在为止,我们所知道的Prolog所搜索的子句只有事实。下面我们来看看Prolog是如何搜索规则的。
首先,Prolog将把目标和规则的子句的头部(head)进行匹配,如果匹配成功,Prolog就把此规则的body部分作为新的目标进行搜索。
X = crackers ;
下面就没有更多的答案了,于是第一层的目标失败。
2-2 REDO edible(crackers)
2-2 FAIL edible(crackers)
其中,
head 是谓词的定义部分,与事实一样,也包括谓词名和谓词的参数说明。
:- 连接符,一般可以读作‘如果’。
body 一个或多个目标,与查询相同。
no
?- where_food(Thing, 'dining room').
no
它也可以用来判断,
?- where_food(apple, kitchen).
我们现在可以直接使用此规则来找到房间中可食的物品。
?- where_food(X, kitchen).
X = apple ;
X = crackers ;
首先我们寻找有where_food/2的子句.
1-1 CALL where_food(X, kitchen)
与第一个子句的头匹配
1-1 try (1) where_food(X, kitchen) ;第一个where_food/2的子句与目标匹配。
2-2 CALL edible(broccoli)
2-2 FAIL edible(broccoli)
2-1 REDO location(X, kitchen)
2-1 EXIT (7) location(crackers, kitchen)
2-1 REDO location(X, kitchen)
2-1 FAIL location(X, kitchen)
下面Prolog开始寻找另外的子句,看看它们的头部(head)能否与目标匹配。在此例中,where_food/2的第二个子句也可以与询问匹配。
yes
或者通过它找出所有的可食物及其位置,
?- where_food(Thing, Room).
Thing = apple
Room = kitchen ;
2-2 CALL edible(apple)
2-2 EXIT (1) edible(apple)
由于Body的所有目标都成功了,所以第一层的目标也就成功了。
1-1 EXIT (1) where_food(apple, kitchen)
更新时间:2004-6-27 文章录入:admin ]
前面我们已经说过,谓词是使用一系列的子句来定义的。以前我们所学习的子句是事实,现在让我们来看看规则吧。规则的实质就是储存起来的查询。它的语法如下:
head :- body
1-1 REDO where_food(X, kitchen)
Prolog又开始试图匹配第二个子句的Body中的目标。
1-1 try (2) where_food(X, kitchen) ;第二个where_food/2的子句与目标匹配。
Prolog教程6-规则神经网络
Prolog教程6-规则 热 ★★★★★
Prolog教程6-规则
[ 作者:佚名 转贴自:垂钓听竹轩 点击数:2673
where_food(X,Y) :- location(X,Y), edible(X).
where_food(X,Y) :- location(X,Y), tastes_yucky(X).
在以前的事实中我们没有把broccoli定义为edible,即没有edible(broccoli).这个事实,所以单靠where_food的第一个子句是不能找出broccoli的,但是我们曾在事实中定义过:tastes_yucky(broccoli).{不好吃(椰菜).},所以如果加入第二个子句,Prolog就可以知道broccoli也是food(食物)了。下面是它的运行结果。
举个例子,上一章中的混合查询--找到能吃的东西和它所在的房间,可以使用如下的规则保存,规则名为where_food/2。
where_food(X,Y) :- location(X,Y), edible(X).
用语言来描述就是“在房间Y中有可食物X的条件是:X在Y房间中,并且X可食。”
下图显示了这种目标嵌套的流程图,请你注意第一层的第三个目标是如何把控制权回溯到第二层的子目标中的。
在这个例子中,第一层的中间的那个目标的结果依赖于第二层的目标的结果。此目标会把程序的控制权传给他的子目标。
下面我们详细地分析一下Prolog在匹配有规则的子句时是如何工作的。请注意用‘-’分隔的两个数字,第一个数字代表当前的目标级数,第二个数字代表当前目标层中正pple)
2-1 REDO location(X, kitchen)
2-1 EXIT (6) location(broccoli, kitchen)
X = apple ;
第一层的回溯过程使得又重新进入了第二层的目标。
1-1 REDO where_food(X, kitchen)
2-2 REDO edible(apple)
2-2 CALL tastes_yucky(apple)
2-2 FAIL tastes_yucky(apple)
2-1 REDO location(X, kitchen)
2-1 EXIT (6) location(broccoli, kitchen)