首页 > 解决方案 > 绘制星星 Prolog 最多 N:画一条线太少了

问题描述

带有参数 N 和 M 的谓词 draw/2 应该最多绘制 M 个星,并且应该增加 N 直到 N > 5。示例:draw(3,5) =>

***
****
*****

我的问题是我的代码最多只能绘制四颗星,所以:

***
****

为什么在 draw/2 中存在 M1 =< N 条件时会发生这种情况?

line(0,_) :- nl.
line(X, Symbol) :-
  write(Symbol),
  Line is X - 1,
  line(Line, Symbol).

% b)

draw(N, N).

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

标签: prolog

解决方案


如果您想计数,您可能需要查看具有类似功能的库谓词的定义:numlist/3

如果您仅采用 中的逻辑numlist_/3,则删除最后一个参数,而是直接使用该值打印一行,您将得到:


draw(U, U) :-
    !,
    line(U).
draw(L, U) :-
    line(L),
    L2 is L+1,
    draw(L2, U).

但是,您将需要添加参数检查。你可以这样做:

line(0) :-
    !,
    nl.
line(X) :-
    succ(X0, X),
    write(*),
    line(X0).

draw(L, U) :-
    L =:= U,
    !,
    line(U).
draw(L, U) :-
    L < U,
    line(L),
    L2 is L+1,
    draw(L2, U).

推荐阅读