循环直到满足条件17 Mar 2025 | 4 分钟阅读 为了重复执行一组指令直到满足给定条件,许多编程语言都提供了“until循环”。 同样,Prolog 没有循环机制,但我们可以通过几种方式获得类似的效果。 递归以下程序展示了递归的使用。 它读取用户从键盘输入的项,并在屏幕上生成项作为输出,直到遇到 end。 在上面的示例中,可以使用 ;/2 析取运算符在单个子句中编写程序。 如果变量 Word 绑定到原子 end,则析取目标 **(Word=end;loop)** 成功。 如果不是,系统会递归尝试满足目标 **loop**。 以下递归程序会反复提示用户输入项,直到用户输入 yes 或 no。 使用“repeat”谓词在 Prolog 程序中,提供循环类型最简单的方法并不总是递归。 提供循环的另一种方法是内置谓词 **repeat**。 目标 **repeat** 并不意味着它重复任何内容。 无论何时调用它,它都只是成功。 **repeat** 的值在回溯时也会成功。 由于这种效果,评估目标的顺序被任何其他成功目标从“从右到左”改变回“从左到右”。 这个谓词也可以产生循环效果。 以下程序反复提示用户输入项,直到用户输入 yes 或 no。 此程序是前一个程序的替代方案。 在 **get_answer** 的主体中,前五个目标将始终成功。 当我们评估第 5 个 目标 **read(Answer)** 时,它会提示用户指定该项。 如果项的输入不是 yes 或 no,则目标 **valid((Answer)** 将失败并显示不确定。 现在 Prolog 将回溯 **read(Answer)** 和 **write('yes or no answer')**。 这两个目标都是不可满足的,这意味着在回溯时,它将始终失败。 现在回溯将转到 **repeat** 谓词并成功。 因此,评估将再次向前(从左到右)进行,并且 **write('yes or no answer')** 和 **read(Answer)** 都会成功。 现在 Prolog 将进一步评估目标 **valid(Answer)**。 根据用户输入的值 **Answer**,目标 **valid(Answer)** 将成功或失败。 如果此目标成功,则最后三个目标将成功,即 **write('The correct answer is ')**、**write(Answer)** 和 **nl**。 如果此目标失败,Prolog 将回溯到谓词 repeat。 总体效果表明,**write('yes or no answer')** 和 **read(Answer)** 这两个目标会重复调用,直到满足目标 **valid(Answer)**(这是终止条件)。 在子句的主体中,**repeat** 目标的左侧永远不会在回溯时到达。 以下程序从指定的文件中读取一系列项。 它将这些项输出到当前输出流,直到遇到项的结尾。 以下程序定义了目标 **repeat** 和 **Y=end** 之间的循环,就像之前的程序一样。 以下行包含在 myfile.txt 文件中。 如果我们调用 readterms,将产生以下输出 下一主题失败时的回溯 |
我们请求您订阅我们的新闻通讯以获取最新更新。