2

我一直在尝试使用 prolog 递归来获得以下输出。?-三角形(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 回答