Prolog简介

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

在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博客

prolog环境配置

1、 下载安装Prolog运行环境SWI-Prolog。

参考(18条消息) 【VS Code】Windows10下VS Code配置Prolog语言环境_memcpy0的博客-CSDN博客icon-default.png?t=M7J4https://memcpy0.blog.csdn.net/article/details/119387437

命令行输入 swipl ,结果如下说明安装成功。?- 相当于命令提示符:
在这里插入图片描述

Hello World的例子如下:

1 ?- write("Hello World").
Hello World
true.

 

2、vscode配置prolog环境

(1)安装prolog插件

 (2)新建文件test.pl

对于test.pl,vscode默认为Perl语言,需要手动点击右下角Perl,切换语言模式为prolog。

 

test.pl如下:

woman(mia).
woman(jody).
woman(yolanda).
playsAirGuitar(jody).
party.

打开终端测试程序是否能够正常运行,步骤如下。 

 

 3、Python与Prolog混合编程

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博客

4、一些注意事项

prolog中注释为 %

发现在vscode中使用prolog,不能出现中文字符,会报错。想来也是有解决方法的,我比较懒就不找了哈哈哈。

Logo

开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!

更多推荐