You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Prolog draw/2谓词绘制星号时少输出一行的问题求解

问题原因分析

核心问题出在你定义的draw/2的终止子句逻辑缺失:

  • 你编写的第一个子句draw(N, N).作为递归终止条件,当当前要输出的星号数量等于上限M时,这个子句会直接匹配成功,没有执行line/2谓词输出对应数量的星号行,所以最后一行(星号数等于M的行)就被直接漏掉了。

我们可以走一遍draw(3,5)的调用流程验证问题:

  1. 调用draw(3,5),匹配第二个子句:执行line(3, '*')输出3个星号的行,计算M1=4,判断4≤5成立,递归调用draw(4,5)
  2. 调用draw(4,5),匹配第二个子句:执行line(4, '*')输出4个星号的行,计算M1=5,判断5≤5成立,递归调用draw(5,5)
  3. 调用draw(5,5),直接匹配第一个子句draw(N,N),无任何输出操作直接结束,因此5个星号的行没有被打印。
修复方案

只需要给终止子句添加输出逻辑即可,修改后的draw/2代码如下:

draw(N, N) :-
  line(N, '*').

draw(M, N) :-
  line(M, '*'),
  M1 is M + 1,
  M1 =< N,
  draw(M1, N).

内容的提问来源于stack exchange,提问作者Julius

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.03 22:09:02