1. Prolog 语法
语法这个词从口中说出来有点生涩陌生,甚至不时让我回忆起高中在操场背3500个英语单词的日子。
要是你也这么想,大可放轻松,下面没有那些有的没的,我们直击主题,就看看这个prolog程序应该怎么写。
注意,这里均是基于swipl风格的代码。swipl是prolog方言的一支,比较友好除了基本的prolog谓词演绎,还省去了很多啰嗦的定义规范,同时还有不少好用的库
refer: wikipedia
2. 基本语法
相爱(张学友,王菲).
相爱(张学友,周慧敏).
相爱(王菲,谢霆锋).
相爱(周慧敏,张学友).
相爱(谢霆锋,王菲).
相爱(谢霆锋,周慧敏).
相爱(刘德华,周慧敏).
爱人(X,Y):-
相爱(X,Y),相爱(Y,X).
抛开定义和更高阶的用法,prolog程序就只有两个部分:
- 事实 Facts
- 规则 Rules
在之后的学习中,你肯定会慢慢觉察到一个关于prolog的事实
事实即规则,规则亦事实
这里分开解释是为了符合正常逻辑,更好理解
(当然在 prolog 中事实可以看做是一种特殊规则的语法糖)
明白了!我们继续用你之前的语气来完成这个 Prolog 教程。
3. Prolog 数据类型
在 Prolog 里,数据类型是构建逻辑程序的基石,虽然它们的表现形式和其他语言有些不同。让我们快速浏览一下:
原子 (Atoms): 原子是 Prolog 中最基本的单位。它们可以是简单的标识符,例如
apple,也可以是用引号括起来的字符串,例如'Hello World'。它们在逻辑推理中扮演着重要角色,常常用来表示不可变的值或符号。数字 (Numbers): Prolog 支持整数和浮点数。整数如
42,浮点数如3.14。这两者都可以用在算术计算和比较中。值得注意的是,Prolog 的数字类型并不像其他语言那样复杂,但它们足够灵活以应对大多数计算任务。变量 (Variables): 变量以大写字母开头,或者是下划线
_。例如X、Variable和_temp。在查询和规则中,变量用于匹配和绑定值,这些值由 Prolog 系统决定。列表 (Lists): 列表是 Prolog 中一种非常强大的数据结构,它们可以包含任意类型的元素。列表由方括号括起来,例如
[1, 2, 3]或['a', 'b', 'c']。空列表[]表示没有元素的列表。列表支持模式匹配,可以用来方便地拆解和操作数据。结构 (Structures): 结构是由一个原子和若干参数组成的复合数据类型。例如,
point(3, 4)和person(name('Alice'), age(30))。结构允许我们创建复杂的数据项,并可以通过它们的原子和参数进行模式匹配。
4. 快速排序实现
很好!你已经完全掌握 prolog 了!(
我们来写一个快排吧!
/* quicksort2.pl 原始来源:http://en.wikipedia.org/wiki/Prolog */
/* quicksort()中的第二个引数带有排序好的结果 */
/* 仅为示范,若为gprolog使用者则用内建sort等较佳 */
/* 在gprolog下之编译例:gplc --min-size quicksort2.pl */
/* 执行 quicksort2 后会出现排序结果 [2,9,18,18,25,33,66,77] */
% 主程序
q :- L = [33, 18, 2, 77, 66, 18, 9, 25],
quicksort(L, Sorted),
write(Sorted),
nl.
% 列表分区
partition([], _, [], []).
partition([X|Xs], Pivot, [X|Smalls], Bigs) :-
X @< Pivot,
partition(Xs, Pivot, Smalls, Bigs).
partition([X|Xs], Pivot, Smalls, [X|Bigs]) :-
X >= Pivot,
partition(Xs, Pivot, Smalls, Bigs).
% 快速排序
quicksort([], []).
quicksort([X|Xs], Sorted) :-
partition(Xs, X, Smalls, Bigs),
quicksort(Smalls, SortedSmalls),
quicksort(Bigs, SortedBigs),
append(SortedSmalls, [X|SortedBigs], Sorted).
% 附加的 append 函数(如果 Prolog 环境不提供)
append([], L, L).
append([X|Xs], L, [X|Zs]) :-
append(Xs, L, Zs).
:- initialization(q).
4.1.1. 解释
partition/4: 这个部分将列表分成两个子列表,一个包含小于Pivot的元素,另一个包含大于或等于Pivot的元素。它是快速排序的核心。quicksort/2: 快速排序算法的实现。通过递归地对Smalls和Bigs列表进行排序,最后合并结果。append/3: 用于将两个列表合并的辅助函数。
通过这个实现,我们可以看到 Prolog 的递归和模式匹配是如何让算法的实现变得简洁明了的。如果有任何问题或者想进一步探讨,请随时告诉我!