Prolog 中的循环

2025年3月17日 | 阅读 3 分钟

循环功能包含在大多数编程语言中。 循环用于使一组指令重复执行固定次数或直到满足给定条件。 Prolog 没有循环功能,但我们可以获得类似的效果。 使用此效果,我们可以重复评估一系列目标。 通过多种方式可以做到这一点,例如内置谓词、递归、回溯或这些的组合。

循环固定次数

为了执行指令固定次数,许多编程语言都提供了“for 循环”。 在Prolog中,没有直接可用的此类工具,但是使用递归,我们可以获得类似的效果,如下面的程序所示

示例 1

该程序输出从指定值到 1 的整数值。

在上面的示例中,我们根据自身定义了循环谓词。 第二个子句读作“要从 N 循环,首先写入 N 的值,然后减一以提供 S,然后从 M 循环”。 此过程将使用第一个子句终止:“当参数为 0 时,停止或不执行任何操作”。 这里第一个子句被称为终止条件。

在第二个子句中,我们使用两个目标 S is N-1, loop(S) 来实现循环谓词。 Prolog 不会处理 loop(N-1) 的明显替代方案。 仅当评估具有 is 函子或关系运算符的目标时,Prolog 才会评估 N-1 等表达式。 如果我们使用 N-1 作为谓词的参数,则意味着带有参数 N 和 1 以及带有中缀运算符 -(减号) 的项。

示例 2

以下程序生成从第一个到最后一个(包括最后一个)的整数值。

上面的 output_value 有两个参数。 它可以解读为“输出从 First 到 Last(包括 Last)的整数”。 当两个参数的值相同时,上面的循环终止。

示例 3

在此程序中,我们将定义一个谓词,该谓词可以找到从 1 到 N 的整数之和。让我们假设 N=100。

为此,我们从 1 开始,然后加 2,然后加 3,……,然后加 100。如果我们用声明的方式根据自身重新表达此过程,则该过程将更容易编程。

100 加上前 99 个整数之和就是前 100 个整数之和。

99 加上前 98 个整数之和就是前 99 个整数之和。

98 加上前 97 个整数之和就是前 98 个整数之和。

………………………………………………………………………………

3 加上前 2 个整数之和就是前 3 个整数之和。

2 加上第一个整数之和就是前 2 个整数之和。

1 是第一个整数之和。

要考虑此过程,我们有两种不同的情况,一般情况和终止情况。 在一般情况下:“前 N 个整数之和是前 N-1 个整数之和加上 N”。 在终止情况下:“第一个整数之和为 1”。


对于保持 N-1 的值,必须使用附加的 N1 变量。 如果写成 sumto(N-1, M1) 等,则无法正确工作。 N-1 不是数值,而是一个术语。

示例 4

该程序用于从给定文件中读取前 6 个术语,然后将这些术语写入到当前输出流。 就像示例 1 一样,它使用“倒数”方法。