Prolog

形式逻辑基础

命题

原子命题由复合项组成。复合项由函子(函数符号)和有序的参数列表组成,只有一个参数的复合项是一元组,有两个参数的是二元组,以此类推。

man(jake)			% 一元组
like(bob, steak)	% 二元组

上述命题没有内在语义,它们的含义可以由我们自行确定。

命题既可以是事实,也可以是疑问

复合命题包含多个原子命题,它们由逻辑连接符或运算符连接。如下面的连接符:

符号 含义
\(\lnot\)
\(\cap\) 合取(与)
\(\cup\) 析取(或)
\(\equiv\) 等价
\(\supset\)
\(\subset\)
蕴含

上述符号越往上的优先级越高。

蕴含符号(\(A\supset B\)\(A\to B\))只有当\(A\)为真\(B\)为假时才为假。封闭世界假设:比如司法系统,如果不能证明一个人有罪,那他就无罪。因此蕴含的前件如果为假,则不能说明命题为假,因此都为真。

量词包括如下两个。只有引入了量词,变量才可以出现在命题中。

名称 符号 含义
全称量词 \(\forall X.P\) 对于所有的\(X\)\(P\)都是真命题
存在量词 \(\exists X.P\) 存在一个的\(X\),使得\(P\)为真命题

子句形式

子句形式命题的语法如下: \[ B_1\cup\cdots\cup B_n\subset A_1\cap\cdots\cap A_n \] 它表示:如果所有的\(A\)都为真,那么至少有一个\(B\)为真。它的特征是不需要存在量词。子句形式命题的右边称为前项,左边称为后项。举例如下: \[ likes(bob,trout)\subset likes(bob,fish)\cap fish(trout) \] Horn子句:左侧(也叫首部)只有一个原子命题或左侧是空命题。

  • 带左部的Horn子句称为有首部Horn子句,用于陈述关系,如上面的例子;
  • 左侧为空的Horn子句称为无首部Horn子句,用于陈述事实。

谓词演算

解析是一种推理规则,它允许从给定的命题中推算出隐含的命题。如下面的例子,解析就是把左边的或起来,右边的与起来,去掉两边相同的。 \[ \begin{align} father(bob,jake)\cup mother(bob,jake)&\subset parent(bob,jake)\\ grandfather(bob,fred)&\subset father(bob,jake)\cap father(jake,fred)\\ \end{align} \] 可以解析为: \[ mother(bob,jake)\cup grandfather(bob,fred)\subset parent(bob,jake)\cap father(jake,fred) \] 命题中的变量需要使用解析来找到变量的值,为变量确定值的过程称为合一,将值临时赋值给变量以实现合一的过程称为实例化

Prolog语法

常用

?-是命令提示符,write()用来输出,nl表示换行,命令以.结束。会返回一个true.

?- write('Hello,'), nl, write('world').
Hello,
world
true.
?- halt.	% 退出

常量和变量

常量:小写字母开头;变量:大写字母开头。

?- write(abc).
abc
true.

?- write(Abc).
_250
true.

abc是常量,输出自身;Abc是变量,输出该变量的值。

事实陈述

friend(jack, peter).	% jack和peter有friend关系
male(jack).				% jack有male属性

规则语句

有首部Horn子句:-表示推理,多个条件用,分隔,\+表示取反。

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

目标语句

无首部Horn子句。系统会做出true或false的回答,如果有变量,系统会尝试通过合一找到变量的实例化。

man(fred).
father(X, mike).

算术

is可以进行算术运算。但右边的变量必须是已经实例化的。

A is 2 + 1.
B is A * 2.

例子

简单使用

先写一个test.pl脚本:

friend(john, julia).
friend(john, jack).
friend(julia, sam).
friend(julia, molly).

在SWI-Prolog里加载脚本,返回true.表示加载成功。

?- [test].
true.

下面是一些查询:

?- friend(john, jack).
true.

?- friend(john, sam).
false.

?- listing(friend).		% 列出所有关系
friend(john, julia).
friend(john, jack).
friend(julia, sam).
friend(julia, molly).

true.

?- friend(john, X).		% 查询X
X = julia ;				% 输入一个;就会继续查询
X = jack.

着色问题

相邻的区域不能是同一种颜色。

% 三种颜色
color(red).
color(green).
color(blue).

colorify(A,B,C,D,E) :-
    color(A), color(B), color(C), color(D), color(E),
    \+ A=B, \+ A=C, \+ A=D, \+ A=E,		% A和BCDE相邻
    \+ B=C, \+ C=D, \+ D=E.		% BC、CD、DE相邻
?- colorify(A, B, C, D, E).
A = red,
B = D, D = green,
C = E, E = blue ;
A = red,
B = D, D = blue,
C = E, E = green ;
A = green,
B = D, D = red,
C = E, E = blue ;
A = green,
B = D, D = blue,
C = E, E = red ;
A = blue,
B = D, D = red,
C = E, E = green ;
A = blue,
B = D, D = green,
C = E, E = red ;
false.

Prolog
https://shuusui.site/blog/2024/12/18/prolog/
作者
Shuusui
发布于
2024年12月18日
更新于
2024年12月19日
许可协议