Prolog⼊门教程(完整版+专家系统案例)
Prolog⼊门教程
在⽹上找了很多prolog的教程,⼤多数都是转载⾃⼀处,但都是⼀部分,先找到原著完整版,并添加⾃⼰的使⽤过程,供⼤家参考。案例吸引
专家系统–根据条件确定⼈名:
human.pl
:- dynamic
known/3,
voice/1,
color/1.
:- discontiguous human/1.
:- t_prolog_flag(unknown, error).
human(john):-
gender(male),系字组词
color(white).
human(mike):-
gender(male),
color(dark).
human(tom) :-
秋的思念gender(female),
voice(muffled_musical_whistle).
human(alice) :-
gender(female),
voice(loud_trumpeting).
family(X) :- ask(family,X).
color(X):- ask(color, X).
%voice(X):-ask(voice,X).
gender(X):-ask(gender,X).
voice(X):-ask(voice,X).
ask(A, V):-
known(yes, A, V), % succeed if true
!. % stop looking
ask(A, V):-
known(_, A, V), % fail if fal
!
, fail.
% known is barfing
ask(A, V):-
write(A:V), % ask ur
write('? : '),
read(Y), % get the answer
asrta(known(Y, A, V)), % remember it
Y == yes. % succeed or fail
top_goal(X) :- human(X).
solve :-
retractall(known(_,_,_)),
top_goal(X),
write('The answer is ------'), write(X), nl.
solve :-
write('No answer found.'), nl.
操作过程:
前记
如果你是⼀位 prolog 的新⼿,希望你⾸先阅读这篇⽂章,好对 prolog 的全局有个了解。在这篇⽂章中我会把 prolog 和其他的程序语⾔做⽐较,所以希望你已经具有了⼀定的编程⽔平。
什么是 prolog ?
prolog 是 Programming in LOGic 的缩写,意思就是使⽤逻辑的语⾔编写程序。 prolog 不是很⾼深的语⾔,相反,⽐较起其他的⼀些程序语⾔,例如 c 、 basic 等等语⾔, prolog 是更加容易理解的语⾔。
如果你从来没有接触过计算机编程,那么恭喜你,你将很容易的进⼊prolog 世界。如果你已经是其他语⾔的⾼⼿,你就需要完全丢弃你原来的编程思路,否则是很难掌握 prolog 的。⼀个例⼦逻辑思维在我们⽇常⽣活中⽐⽐皆是, prolog 正是把这种思维⽤⽂字描述出来的计算机语⾔。
还是⾸先举个例⼦吧。
⽐如⼀群年轻⼈正在恋爱,每个⼈都有⾃⼰⼼中所追求的对象:
张学友爱王菲
张学友爱周慧敏
王菲爱谢廷峰
周慧敏爱张学友
谢廷峰爱王菲
谢廷峰爱周慧敏
刘德华爱周慧敏
…
我们说两个年轻⼈要互相都喜爱,他们就算是⼀对情侣,那么上⾯的谁和谁是情侣呢?这应该算是⼀道最简单逻辑推理题⽬了,那么我们如何⽤ prolog 语⾔实现呢?“张学友爱王菲”是⼀条已知的事实,
⽤ prolog 语⾔来表达就是:
十五大时间
爱 ( 张学友 , 王菲 ).
注意 1 :这⾥是为了阅读⽅便才使⽤汉字的,真正的 prolog 是不允许使⽤除了基本字符以外字符的,也就是说,上⾯的句⼦必须写成love(zhangxueyou,wanfei). ,电脑才能够真正的理解。
注意 2 :最末尾的“ . ”⼀定不能掉,它表⽰⼀个句⼦结束。
注意 3 :上⾯词汇对于电脑来说并没有真正的含义,所以我们完全可以⽤ ai(zxy,wf). 来表达这个关系,更进⼀步,我们甚⾄可以⽤
xxx(a,b). 来表达,只要你⾃⼰⼼⾥清楚 xxx 表⽰爱, a 表⽰张学友, b 表⽰王菲就可以了。
注意 4 :张学友和王菲的顺序也没有特别的规定,你完全可以把他们换个位置:爱 ( 王菲 , 张学友 ). 只要你⼼⾥清楚它表达的意思就⾏了,⽽以后都遵循这种被爱的⼈在前⾯的顺序,就不会出错。
其他的事实我就不写了,你可以参照上⾯的例⼦⾃⼰把已知事实翻译成 prolog 的语句。
那么情侣的概念怎么定义呢?也很简单!
情侣 ( 某⼈甲 , 某⼈⼄ ):- 爱 ( 某⼈甲 , 某⼈⼄ ), 爱 ( 某⼈⼄ , 某⼈甲 ).
:- 在 prolog 中表⽰“如果”的意思,我们使⽤它来定义规则。杨六斤
上⾯这句话的意思就是,某⼈甲和某⼈⼄是情侣的规则就是:某⼈甲爱某⼈⼄,并且某⼈⼄爱某⼈甲。上⾯⽤来分隔两个爱的句⼦
的“,”表⽰并且的意思。
当然为了能够让电脑运⾏,这个句⼦要改为英⽂的: lovers(X,Y):-love(X,Y),love(Y,X).
注意:在 prolog 中以⼩写字符开头的字符串代表确知的事物,⽐如 love 表⽰爱这种关系,⽽ zhangxueyou 表⽰张学友。⽽以⼤写字母开头的字符串表⽰未确定的事物,翻译成汉语就是某某。
完整的可运⾏的 prolog 程序如下:(我的拼⾳不好,要是什么⼈的名字拼写错了,请原谅:)
love(zhangxueyou,wanfei).
love(zhangxueyou,zouhuimin).
love(wanfei,xietinfen).
love(zouhuimin,zhangxueyou).
love(xietinfen,wanfei).
love(xietinfen,zouhuimin).
love(liudehua,zouhuimin).
lovers(X,Y):-love(X,Y),love(Y,X).
好声音吧我们可以看出来,完整的 prolog 程序是有事实和规则组成的。事实⽤来储存⼀些数据,⽽规则⽤来储存某种可以推理出来的关系。
瀑布怎么画
如果把上⾯的程序调⼊ prolog 解释器(关于 prolog 解释器,在后⾯有介绍)然后就可以对以上的程序进⾏询问。
prolog 解释器的提⽰符号为“ ?- ”,你只需要在这个提⽰符后⾯输⼊⾃⼰的句⼦就可以了。
让我们来看第⼀个询问:
-love(zhangxueyou,wanfei).
事实上我们的询问完全和程序中的第⼀条事实⼀样,这个询问是“是⾮”询问,也就是说电脑回答的答案是 yes 或者 no 。
上⾯的询问的含义是:就你所知,张学友爱王菲么?
由于我们的程序中间有这样的事实,所以解释器将回答。yes.
如果我们问:
-love(zhangxueyou,liudehua).
解释器将回答 no.
因为它没有发现 love(zhangxueyou,liudehua). 这个事实。
在询问中我们可以使⽤⼤写字母代表未知的事物,让解释器找到答案。
单的笔顺怎么写例如:
-love(zhangxueyou,X).
这句话询问的是:张学友都喜欢哪些⼈。
解释器将给出答案:
X=wanfei ;
X=zouhuimin ;
no.
注意 1 :上⾯的两个“ ; ”是⼈⼯输⼊的,当解释器找到⼀个答案之后,它将这个答案输出,并且等待⽤户的进⼀步输⼊,如果⽤户输
⼊“;”,解释器将继续寻找其他的答案,如果输⼊的是别的符号,解释器将终⽌查询。
最后那个 no. 是因为系统在输出了 zouhuimin 这个答案以后,⽤户输⼊“;”,表⽰还想知道其他的答案,⽽解释器⼜找不到其他的答案了,于是输出 no. 来终⽌查询。
我们再看⼀个例⼦:
-love(X,zouhuimin).
X=zhangxueyou;
X=xietinfen;
X=liudehua;
no.
在上⾯的询问中,我们只涉及到对事实的查询,下⾯我们来看规则的⽤法。
- lovers(X,Y).
X = zhangxueyou Y = zouhuimin ;
X = wanfeiY = xietinfen ;
X = zouhuiminY = zhangxueyou ;
X = xietinfenY = wanfei ;
no
我们看到 lovers(X,Y). 找出了系统中所有的恋⼈。
不过每对恋⼈被显⽰了两次,这是因为 prolog 是考虑顺序的,也就是说 lovers(a,b). 和 lovers(b,a). 并不等价。
这⼀点在后⾯的学习中,你会了解。
再看⼀个例⼦:
- lovers(wanfei,Y).
Y = xietinfen ;
no
询问王菲的恋⼈,结果是 xietinfen 。
呵呵,还挺聪明的。我们看到同样是 lovers ,根据其参数不同,功能也不同,这也是 prolog 的⼀个⼤特点。
最后让我们编写⼀个寻找情敌的规则来结束这⼀节内容吧。
rival_in_love(X,Y):-love(X,Z),not(love(Z,X)),love(Z,Y).明兴宗
这段程序可以理解为:
Y 是 X 的情敌的条件是: X 喜欢 Z( 代表某个⼈ ) ,⽽ Z 不喜欢 X ,⽽ Y 是 Z 喜欢的⼈。哈哈,这不正是情敌的条件嘛。
- rival_in_love(X,Y).
X = zhangxueyouY = xietinfen ;
X = xietinfenY = zhangxueyou ;
X = liudehuaY = zhangxueyou ;
no
好了,你⾃⼰分析⼀下为什么会是这样的答案吧。
为什么要 prolog
看完上⾯的例⼦,不知道是否提起了你对 prolog 的兴趣。如果你感兴趣的话,那么让我们继续来看 prolog 能够做⼀些什么事情吧。
理论上来说使⽤ c 语⾔可以编制任何种类的程序,甚⾄连 prolog 语⾔都是使⽤ c 语⾔编写的。不过对于急于开发应⽤程序的⽤户,最关⼼的是如何最经济最有效率的开发程序, prolog 为你多提供了⼀个选择的余地。
prolog很适合于开发有关⼈⼯智能⽅⾯的程序,例如:专家系统、⾃然语⾔理解、定理证明以及许多智⼒游戏。曾经有⼈预⾔prolog将成为下⼀代计算机的主要语⾔,虽然这个梦想⽬前还很难实现,不过世界上已经有许多prolog的应⽤实例了。你要坚信,它绝对不是那种只在实验室发挥作⽤的语⾔,之所以⼤多数⼈都不了解它,是因为它的应⽤范围⽐较特殊⽽已。
prolog 有许多不⾜之处,但是这并不影响它在逻辑推理⽅⾯的强⼤功能,不过最好的⽅法是使⽤某种⼀般语⾔和 prolog 结合,⼀般语⾔完成计算、界⾯之类的操作,⽽ prolog 则专⼼实现逻辑运算的操作。
例如:你编写⼀个下棋程序,⽤ prolog 来让电脑思考如何下棋,⽽⽤ Visual Basic 来编写界⾯。我们将在以后介绍这⽅⾯的技术。
总之, prolog 在许多⽅⾯将极⼤的减少你的编程负担,所以赶快来了解⼀下它吧, 也许你⽇后遇到什么难题,可以使⽤ prolog 迎刃⽽解,到那个时候,你就知道今天的学习没有⽩费了。
prolog 的特点
我个⼈总结了 prolog 的以下⼏个特点,因为叫做特点,所以⾃然要和其他的语⾔进⾏⽐较。