Я новичок в Прологе, и мне было поручено предикат Фибоначчи 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» в качестве аргументов, вместо того, чтобы сначала присвоить эти значения новым переменным. Но я не понимаю ... потому что в других рекурсивных кодах Пролога я успешно сделал именно это (уменьшил значение переменной прямо в слоте аргумента). Имеет ли это смысл?
Спасибо!
Ниже приведен пример, где "N-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).