Prolog 语言入门

Prolog 是一种与众不同的语言,不用来开发软件,专门解决逻辑问题。比如,"苏格拉底是人,人都会死,所以苏格拉底会死"这一类的问题。离散数学中的谓词量词那章。

Prolog 就是"逻辑编程"(programming of Logic)的意思。只要给出事实和规则,它会自动分析其中的逻辑关系,然后允许用户通过查询,完成复杂的逻辑运算。

1.环境准备

windows10+SWI-Prolog,傻瓜式安装即可

安装之后找到bin目录下的swipl-win.exe运行

2.Hello world入门

  1. 进入了Prolog 运行环境,?-是命令提示符,输入:write(“Hello world”).

Prolog 所有语句的结尾都用一个"点"(.)表示结束,write()是打印函数。

?- write("Hello world").
Hello world
true

2.退出 SWI-Prolog,可以使用halt命令,后面加点.

?- halt.

3.基本语法入门备

1. 常量与变量: >很简单,Prolog中小写字母开头就是常量,大写字母开头就是变量( 记得加点
?- write(ha)
|    .
ha
true.

?- write(Ha)
|    .
_2280
true.
  1. 关系和属性

两个对象之间的关系,使用括号表示。比如,jack 的朋友是 peter,写成friend(jack, peter).。
注意,jack 的朋友是 peter,不等于 peter 的朋友是 jack。如果两个人都认为对方是朋友,要写成下面这样。

friend(jack, peter).
friend(peter, jack).

如果括号里面只有一个参数,就表示对象拥有该属性,比如 mark 是男性,写成male(mark).。

  1. 规则

规则是推理方法,即如何从一个论断得到另一个论断。
举例来说,我们定下一条规则:所有朋友关系都是相互的,规则写成下面这样。

friend(X, Y) :- friend(Y,X).

上面代码中,X和Y都是大写,表示这是两个变量。符号:-表示推理关系,含义是只要右边的表达式friend(Y, X)为true,那么左边的表达式friend(X, Y)也为true。因此,根据这条规则,friend(jack, peter)就可以推理得到friend(peter, jack)。

如果一条规则取决于多个条件同时为true,则条件之间使用逗号分隔。

mother(X, Y) :- child(Y,X), female(Y).

上面代码中,X的母亲是Y(mother(X, Y))取决于两个条件:Y的小孩是X,Y必须是女性。只有这两个条件都为true,mother(X, Y)才为true。

如果一条规则取决于某个条件为false,则在条件之前加上+表示否定。

onesidelove(X, Y) :- loves(X, Y), \+ loves(Y,X).

上面代码中,X单相思Y,取决于两个条件。第一个条件是X喜欢Y,第二个条件是Y不喜欢X。

  1. 查询
    我们先创建一个pl文件进行测试:hello.pl文件内容如下:
classmate(tom,tim).
classmate(tom,mark).
classmate(tim,john).
classmate(john,mark).

在SWI控制台导入文件

['F:/SWI-Prolog/swipl/demo/hello.pl'].

显示为true标识导入成功。

4.1 查找两个人是否是同学

?- classmate(tom,tim).
true .

?- classmate(tom,john).
false.

4.2 列出所有的同学关系(查找所有)

?- listing(classmate).
classmate(tom, tim).
classmate(tom, mark).
classmate(tim, john).
classmate(john, mark).

4.3 查找tom的所有同学

classmate(tom,Who).
Who = tim 

只显示一个数据,但是指定的文件可以看出,期望的结果应该是两个,此时按n键就会显示下一条。上面的Who是变量名,可以随意更改,只要是大写字母开始就可以。

4.基本语法入门备

1.经典问题-地图着色问题
Prolog 语言入门_第1张图片

我们知道,地图的相邻区域不能使用同一种颜色。现在有三种颜色:红、绿、蓝、黄。请问如何为上面这幅地图着色?
首先,定义四种颜色。

color(red).
color(green).
color(blue.
color(yellow).

然后,定义着色规则。

colorify(A,B,C,D,E,F) :-
    color(A), color(B), color(C), color(D), color(E),color(F),
    \+ A=B, \+ A=C, \+ A=D, \+ A=E,\+ A=F
    \+ B=C,\+ B=D,\+B=F, \+ D=E, \+ D=F,\+ E=F.

上面代码中,colorify(A,B,C,D,E,F)是一个对 ABCDEF六个变量求值的表达式。该表达式为true的条件是,这五个变量各自为一种颜色,则相邻的变量不相等。
将上面的代码整合到color.pl中

color(red).
color(green).
color(blue).
color(yellow).
colorify(A,B,C,D,E,F) :-
    color(A), color(B), color(C), color(D), color(E),color(F),
    \+ A=B, \+ A=C, \+ A=D, \+ A=E,\+ A=F
    \+ B=C,\+ B=D,\+B=F, \+ D=E, \+ D=F,\+ E=F.

导入文件进行测试:

['F:/SWI-Prolog/swipl/demo/color.pl'].
true.

?- colorify(A,B,C,D,E,F).
A = red,
B = E, E = green,
C = D, D = blue,
F = yellow ;
A = red,
B = E, E = green,
C = F, F = blue,
D = yellow ;
A = red,
B = E, E = green,
C = F, F = yellow,
D = blue ;
A = red,
B = E, E = green,
C = D, D = yellow,
F = blue ;
A = red,
B = E, E = blue,
C = D, D = green,
F = yellow ;
A = red,
B = E, E = blue,
C = F, F = green,
D = yellow ;
A = red,
B = E, E = blue,
C = F, F = yellow,
D = green ;

好吧。方式确实很多,小伙伴们可以测试一下三个颜色的结果(O(∩_∩)O)!!!
参考:

  • Prolog 语言入门教程
  • 介绍逻辑编程语言 Prolog

你可能感兴趣的:(Prolog)