我需要编写一个递归谓词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).
答案 0 :(得分:1)
我知道你的作业需要一个递归程序,那么你不应该把它当作一个答案。但我想展示一种可能的简洁解决方案,使用metapredicate:
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)).
答案 1 :(得分: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).