programming in logic 的缩写,prolog是一种逻辑编程语言。1972年正式诞生。
Prolog程序的特点
Prolog的程序结构
三种语句:
完整的 prolog 程序是由事实和规则组成的。
事实用来储存一些数据,而规则用来储存某种可以推理出来的关系。
(1)事实
事实的语法结构如下:pred(arg1,arg2,...argN).
pred为谓词的名称
arg1,...为参数,共有N个
‘.’是所有的Prolog子句的结束符
没有参数的谓词形式如下:pred.
例子:
student(john)
like(marry,music)
abc.
repeat.
事实的参数
参数可以是以下四种之一:
整数(integer):绝对值小于某一个数的正数或负数
原子(atom):由小写字母开头的字符串
变量(variable):由大写字母或下划线_开头
结构(structure):用于构造PROLOG数据对象
注:
关于原子
通常,原子由字母和数字组成,必须由小写字母开头。
可以使用下划线把单词分开。
原子与变量
变量和原子相似,但开头字符是大写字母或是下划线。
在 prolog 中以小写字符开头的字符串代表确知的事物,比如 love 表示爱这种关系,而 zhangxueyou 表示张学友。而以大写字母开头的字符串表示未确定的事物。
关于结构
(2)规则
表示对象间的因果关系、蕴含关系或对应关系。
格式:
head:-body
head是谓词的定义部分,与事实一样,也包括谓词名和谓词的参数说明
:-连接符,一般可以读作‘如果’
body一个或多个目标,与查询相同
bird(X):-annimal(X),has(X,feather).
grandfather(X,Y):-father(X,Z),father(Z,Y).
规则中的谓词也可以无参数:
run:-start,step1(X),step2(X),end.
(3)查询
Prolog的查询工作靠模式匹配完成
查询的模板叫做目标(goal)
如果有某个事实与目标匹配,那么查询成功,解释器会回显‘yes.’
如果没有匹配的事实,查询失败,解释器回显'no.‘
Prolog的模式匹配工作叫做合一(unification),以下三个条件是使合一成功的必要条件
目标谓词名与数据库中的某个谓词名相同
这两个谓词的参数数目相同
所有的参数也相同
对事实的查询示例:
输入完整的可运行的 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 解释器的提示符号为“ ?- ”,只需要在这个提示符后面输入自己的句子就可以了。
让我们来看第一个询问:
?-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. 来终止查询。示例来自
关于规则的查询示例:
在上面的询问中,我们只涉及到对事实的查询,下面我们来看规则的用法。
?- lovers(X,Y).
X = zhangxueyou Y = zouhuimin ;
X = wanfei Y = xietinfen ;
X = zouhuimin Y = zhangxueyou ;
X = xietinfen Y = 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中不提供if-then-else,for等语法,需要自己定义,也就是要先声明怎么执行,然后再才能调用它。
if_then_else(Condition,Then,Else) :-
call(Condition) -> call(Then) ; call(Else).
test(A):-
if_then_else( %对上面的定义进行使用
A=:=1, %Condition 如果有多个需满足的条件用括号括起来 在括号之后加逗号
write('A==1'),
write('A!=1')
).
原文链接
(18条消息) Prolog中if_then_else,if_then,unless的定义和使用_子子钱的博客-CSDN博客
参考(18条消息) 【VS Code】Windows10下VS Code配置Prolog语言环境_memcpy0的博客-CSDN博客https://memcpy0.blog.csdn.net/article/details/119387437
命令行输入 swipl
,结果如下说明安装成功。?-
相当于命令提示符:
Hello World的例子如下:
1 ?- write("Hello World").
Hello World
true.
(1)安装prolog插件
(2)新建文件test.pl
对于test.pl,vscode默认为Perl语言,需要手动点击右下角Perl,切换语言模式为prolog。
test.pl如下:
woman(mia).
woman(jody).
woman(yolanda).
playsAirGuitar(jody).
party.
打开终端测试程序是否能够正常运行,步骤如下。
pyswip是python与swiprolog之间的桥梁。对pyswip进行安装:
pip install pyswip
安装过程中遇到了一些问题,记录一下。
无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。
原因:环境变量中缺失pip程序路径,需要手动将pip所在路径(Python安装路径下,scripts文件夹)添加到环境变量。
参考:
(18条消息) 无法将“pip”项识别为 cmdlet、函数、脚本文件或可运行程序的名称_Nailaoyyds的博客-CSDN博客_无法将“pip”项识别为
虽然但是,又出现了新的问题。。。
python中使用pip提示: Fatal error in launcher: Unable to create process using
解决方法:更新安装pip就可以很好的解决这个问题。
python -m pip install --upgrade pip
参考:
(18条消息) python中使用pip提示: Fatal error in launcher: Unable to create process using_florachy的博客-CSDN博客
prolog中注释为 %
发现在vscode中使用prolog,不能出现中文字符,会报错。想来也是有解决方法的,我比较懒就不找了哈哈哈。