2017-01-05 9 views
0

Я новичок в Prolog. Я пытаюсь найти n-й член и сумму серии Фибоначчи.Turbo Prolog: 420 PROLOG.ERR отсутствует

/* Fibonacci */ 

predicates 
    fibonacci(integer, integer, integer) 

clauses 
fibonacci(1,1,1):-!. 
fibonacci(2,1,2):-!. 

fibonacci(N, Term, Sum):- 
    N1 = N - 1, 
    N2 = N - 2, 
    fibonacci(N1, Term1, Sum1), 
    fibonacci(N2, Term2, Sum2), 
    Term = Term1 + Term2, 
    Sum = Term + Sum. 

Однако при компиляции в Турбо Прологе я получаю 420 PROLOG.ERR отсутствует на

Фибоначи (N2, term2, sum2),

Почему это происходит? Любая помощь приветствуется. Заранее спасибо.

+1

'Фибоначи (N2, term2, sum2)' 'выглядит как Sum2' не используется нигде. Это предназначено? Хотя я не знаю, почему это будет помечено как ошибка. Это должно быть предупреждение. Вы также должны пересмотреть свою реализацию. Два рекурсивных вызова очень неэффективны и не нужны. Если вы ищете «fibonacci» в этом разделе Stackoverflow, вы найдете множество примеров. – lurker

+0

ОК .. поиск по SO для лучшего решения. Но просто интересно узнать, что такое ошибка? :) – lU5er

+0

@ lurker Я думаю, вы поняли это правильно! Поскольку я не использую этот термин TP, это бросает это. Я просто использовал фиктивную переменную для хранения значения типа 'dummy = Sum2'.Теперь ошибка смещена в эту строку. – lU5er

ответ

1

Действительно ли это сообщение об ошибке? Он не говорит что отсутствует?

EDIT: В соответствии с комментариями ниже, Турбо Пролог = делает действительно соответствует is/2, поэтому приведенному ниже замечанию, которые правильно для Пролога, не применяется. Согласно комментариям по первому вопросу, ужасное сообщение об ошибке может быть однотоновым предупреждением для Sum2.

В любом случае: Если предположить, что clauses части Турбо Пролог соответствует стандарту Пролога, ни один из N1, N2, Term и Sum будет целыми числами в вашей программе. = соответствует унификация, нет оценка по арифметике. Если вы звоните fibonacci(3, Term, Sum), то внутри звонка N1 будет привязан к неинтерпретированному термину 3 - 1, не к целому числу 2. То же самое относится к другим вашим использованиям =.

Для арифметической части, вы хотите использовать is/2: N1 is N - 1, N2 is N - 2 и т.д. Это будет оценивать правую часть как арифметическое выражение и на самом деле связать эти переменные для целых чисел.

Не задумываясь об этом слишком сложно, мне непонятно, если это приведет к полезному вычислению для Term.

+0

Я думаю, что указанная вами часть неверна. См. 'Lyra.ifas.ufl.edu/ABE6644/prologexamples.txt'. Turbo Prolog позволяет присваивать '='. Поэтому я не думаю, что это проблема. – lU5er

+1

@ Исабель, к сожалению, Turbo Prolog (или Visual Prolog, или PDC Prolog, в основном то же самое) не очень стандартная. В TP они используют объявленные разделы кода, такие как 'clauses' и' predicates'. Кроме того, в TP, '=' действует как ISO 'is/2' – lurker

+0

@Apy Я согласен с Isabelle здесь, что ваше цитированное сообщение об ошибке кажется неполным. «Отсутствует» что? – lurker

1

Я угадываю турбо не могу найти файл с описаниями ошибок. выглядит неправильно установленным tp? исправьте это, и вы получите более информативное сообщение.

Посмотрите на http://rosettacode.org/mw/index.php?title=Fibonacci_sequence&action=edit&section=399 и внесите изменения, чтобы не только найти Nth, но и Sum.

вы получите что-то вроде: ----

 
% fibsum(i, n, fib(i-2), fib(i-1), fib(i), sum(i-1), sum(i)) 
fibsum(N, N, Fi2, Fi1, F, Si1, S) :- 
    F is Fi2 + Fi1, 
    S is Si1 + F. 
fibsum(I, N, Fi2, Fi1, F, Si1, S) :- 
    In is I + 1, 
    Fn is Fi2 + Fi1, 
    Sn is Si1 + Fn, !, 
    fibsum(In, N, Fi1, Fn, F, Sn, S).

% fibs(i, fib(i), sum(i)) fibs(1, 1, 1). fibs(2, 1, 2). fibs(C, N, S) :- C > 2, fibsum(3, C, 1, 1, N, 2, S). % Generate from 3rd on

--- (едва протестирован на http://swish.swi-prolog.org/)

 Смежные вопросы

  • Нет связанных вопросов^_^