写一个显示M * N星号网格的prolog程序?

时间:2013-03-09 17:18:17

标签: prolog

我需要编写一个递归谓词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).

2 个答案:

答案 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).