1

アスタリスクのサイズの塗りつぶされた四角形を書き出すrectangleような再帰述語を書く必要があります。つまり、四角形に行と列があるはずです。例えば:rectangle(M, N)M x NMN

?- 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

アスタリスクの無限グリッドを取得するのは、rectangle(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 に答える