2

次の出力を取得するためにプロローグ再帰を使用しようとしています。?- 三角形(5)。

  ++++1
  +++12
  ++123
  +1234
  12345

これは私がこれまで行ってきたことですが、期待される出力が得られません。

triangle(X):-X>=1,nl, LS is X-1,plus(LS),triangle(LS),process(X),nl.
triangle(X):-X=<1.
process(X):- X>=1,NS is X+1,process(NS),write(X).

process(X):-X=<1.

plus(N):-N>=1, LS is N-1, write('+'),plus(LS).

plus(N):-N=<1.
4

2 に答える 2

1

「ループアラウンド」したい次元ごとに変数を追加する必要があります。

次に、各行を繰り返し、各行で列を繰り返します。新しい述語の名前を追加する代わりに、変数を追加して区別できます。

triangle(N) :-
    triangle(1, N).

triangle(R, N) :-
    triangle(1, R, N),
    (   R < N
    ->  R1 is R+1,
        triangle(R1, N)
    ;   true
    ).

triangle(C, R, N) :-
    (   C =< N-R
    ...
    ),
    (   C < N
    ...
    ;   nl
    ).

行の印刷ルールでは、いくつかのトリッキーなコードを残して、練習のために見つけます:)

于 2013-11-12T17:13:34.023 に答える
0

findall で解決しようと決めたので、ここに私の解決策があります:)

print_array([]):-nl.
print_array([H|T]) :- maplist(write,H),nl,print_array(T).
triangle(N) :- numlist(1,N,Nums),
               findall('+',member(_,Nums),Pluses),
               findall(R,(prefix(NumL,Nums),prefix(P,Pluses),not(NumL=[]),length(P,PL),length(NumL,NL),N is PL+NL,append(P,NumL,R)),Rez),
               print_array(Rez).
于 2013-11-12T20:30:47.117 に答える