Я новичок в Прологе, и мне поручили использовать предикат Фибонначи fib( N, F), где N — число в последовательности, а F — значение. То, что я придумал, не работает, но решение, которое я нашел, кажется мне идентичным... Я не могу понять разницу.
Моя версия:
/* MY VERSION, DOES NOT WORK */
fib( 0, 0).
fib( 1, 1).
fib(N,F) :-
N > 1,
fib(N-1,F1),
fib(N-2,F2),
plus(F1,F2,F).
Рабочая версия:
/* FOUND SOLUTION, DOES WORK */
fib( 0, 0).
fib( 1, 1).
fib(N,F) :-
N > 1,
N1 is N-1,
N2 is N-2,
fib(N1,F1),
fib(N2,F2),
plus(F1,F2,F).
Очевидно, проблема связана с тем, что я использую «N-1» и «N-2» в качестве аргументов, а не сначала присваиваю эти значения новым переменным. Но я этого не понимаю... потому что в других рекурсивных кодах Пролога я успешно сделал именно это (уменьшил переменную прямо в слоте аргумента). Имеет ли это смысл?
Спасибо!
Ниже приведен пример, когда «Н-1» действительно работал.
line( N, _, _) :-
N =:= 0.
line( N, M, Char) :-
N > 0,
N mod M =\= 1,
write( Char), write( ' '),
line( N-1, M, Char).
line( N, M, Char) :-
N > 0,
N mod M =:= 1,
write( Char), write( '\n'),
line( N-1, M, Char).
square( N, Char) :-
N > 0,
line( N*N, N, Char).
Новая версия fib/2, которая тоже работает!
/* NEW VERSION, CHANGED TRIVIAL CASES TO EVALUATE N */
fib( N, 0) :-
N =:= 0.
fib( N, 1).
N =:= 1.
fib(N,F) :-
N > 1,
fib(N-1,F1),
fib(N-2,F2),
plus(F1,F2,F).
>
похож наis
в том, что он оценивает арифметику (я хочу разместить здесь ссылку, но ТАК интерпретирует скобки - добавит к моему ответу). Очень аккуратный. - person Owen   schedule 26.08.2011