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 里,数据类型是构建逻辑程序的基石,虽然它们的表现形式和其他语言有些不同。让我们快速浏览一下:

  1. 原子 (Atoms): 原子是 Prolog 中最基本的单位。它们可以是简单的标识符,例如 apple,也可以是用引号括起来的字符串,例如 'Hello World'。它们在逻辑推理中扮演着重要角色,常常用来表示不可变的值或符号。

  2. 数字 (Numbers): Prolog 支持整数和浮点数。整数如 42,浮点数如 3.14。这两者都可以用在算术计算和比较中。值得注意的是,Prolog 的数字类型并不像其他语言那样复杂,但它们足够灵活以应对大多数计算任务。

  3. 变量 (Variables): 变量以大写字母开头,或者是下划线 _。例如 XVariable_temp。在查询和规则中,变量用于匹配和绑定值,这些值由 Prolog 系统决定。

  4. 列表 (Lists): 列表是 Prolog 中一种非常强大的数据结构,它们可以包含任意类型的元素。列表由方括号括起来,例如 [1, 2, 3]['a', 'b', 'c']。空列表 [] 表示没有元素的列表。列表支持模式匹配,可以用来方便地拆解和操作数据。

  5. 结构 (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. 解释

  1. partition/4: 这个部分将列表分成两个子列表,一个包含小于 Pivot 的元素,另一个包含大于或等于 Pivot 的元素。它是快速排序的核心。

  2. quicksort/2: 快速排序算法的实现。通过递归地对 SmallsBigs 列表进行排序,最后合并结果。

  3. append/3: 用于将两个列表合并的辅助函数。

通过这个实现,我们可以看到 Prolog 的递归和模式匹配是如何让算法的实现变得简洁明了的。如果有任何问题或者想进一步探讨,请随时告诉我!

Copyright © zhzluke96 2020 all right reserved,powered by Gitbook该文件修订时间: 2026-06-30 16:08

results matching ""

    No results matching ""