Треугольник Паскаля в Прологе

Я написал функцию для возврата следующей строки в треугольнике Паскаля с учетом текущей строки:

pascal_next_row([X],[X]).
pascal_next_row([H,H2|T],[A|B]):-
    pascal_next_row([H2|T],B),
    A is H + H2.

Я хочу найти n-ю строку в треугольнике, например. pascal(5,Row), Row=[1,5,1,0,1,0,5,1]. У меня есть это:

pascal(N,Row):-
 pascalA(N,[1,0],Row).

pascalA(N,R,_Row):-
 N > 0,
 M is N-1,
    next_row([0|R],NR),
    pascalA(M,NR,NR).

Очевидно, что Row должен быть последним, найденным перед n==0. Как мне его вернуть? Я пробовал использовать ключевое слово is, т.е. Row is NR, но это явно запрещено. Любая помощь?


Попытка использовать is в списках приводит меня к следующему:

! Domain error in argument 2 of is/2
! expected expression, but found [1,4,6,4,1,0]
! goal:  _23592586 is[1,4,6,4,1,0]

person blork    schedule 15.11.2009    source источник


Ответы (2)


Выполните базовый вариант, N > 0 отменяет ваш расчет ...

pascalA(N,R,_Row):-
 N > 0, %% this evaluates to false so the calculation gets canceled
 M is N-1,
    next_row([0|R],NR),
    pascalA(M,NR,NR).

pascalA(0,R,R). %% this should be the base case... hope I got it correct...

pascalA(N,R,_Row):-
 M is N-1,
    next_row([0|R],NR),
    pascalA(M,NR,_Row).
person Egon    schedule 15.11.2009
comment
Кажется, я не могу использовать функцию is в списках. Я использую SICStus и получаю сообщение об ошибке ! Domain error in argument 2 of is/2 ! expected expression, but found [1,4,6,4,1,0] ! goal: _23592586 is[1,4,6,4,1,0] - person blork; 15.11.2009
comment
о, извините ... Я забыл, что это список ... Я писал это по памяти (читай: не тестировал) ... Думаю, замена is на = может сработать ... - person Egon; 15.11.2009

Вам нужен базовый вариант для pascalA, где N = 0.

person starblue    schedule 15.11.2009