1

我需要编写一个递归谓词rectangle,以便rectangle(M, N)写出一个星号大小的实心矩形M x N,即矩形中应该有M行和N列。例如:

?- rectangle(3,8).
********
********
********
true

到目前为止,我有在一行上line打印N星号的语句:

line(0).
line(N) :- write('*'), A is N-1 , line(A).

我已经尝试了一切,但我不断得到无限的星号网格。这是我到目前为止所得到的:

rectangle(0,0).
rectangle(M,N) :-
    line(M),
    write('*'), nl, A is N-1, line(A-1),
    rectangle(M,A).
4

2 回答 2

1

我知道您的作业需要一个递归过程,那么您不应该将此视为答案。但我想展示一个可能的简洁解决方案,使用元谓词:

loop_n(P, N) :- forall(between(1, N, _), P).
rectangle(R, C) :- loop_n((loop_n(write(*), C), nl), R).

不是每个 Prolog 都支持调用变量。例如,在我的旧 Prolog 解释器中,我会写loop_n(P, N) :- forall(between(1, N, _), call(P)).

于 2013-03-09T21:24:21.343 回答
0

获得无限的星号网格是因为您尚未定义矩形(M,0)。所以,代码应该如下:

rectangle(0,0).
rectangle(M,0).
rectangle(M,N) :-
    line(M),nl, A is N-1, rectangle(M,A).
line(0).
line(B) :- write('*'), Z is B-1 , line(Z).
于 2016-11-25T14:22:25.030 回答