2009-10-03 9 views

ответ

7

Поскольку арифметические операции выполняются только в пунктах через оператора is. В первом примере Y1 связан с результатом вычисления Y - 1. В дальнейшем система пытается доказать силу предложения (X, Y - 1, Z1), которая объединяется с мощностью (X ', Y', Z ') связывание X' = X, Y '= Y - 1, Z' = Z. Это затем снова повторяется, поэтому Y '' = Y - 1 - 1 и т. Д. Для бесконечности, никогда не выполняющего вычисления.

Пролог - это в первую очередь просто объединение терминов - расчет, в «общем» смысле, должен быть задан явно.

+0

не Y - Y '- Y '' - Y ''' ... - 1 в конечном счете равен нулю впадая в базовом случае и завершения рекурсии? – TheOne

+0

Нет, в Prolog 'Y - 1', когда' Y = 1' по-прежнему 'Y - 1', пока он не связан :) –

+0

Действительно - это просто синтаксическая форма. Инфиксная нотация - это только обозначение. Это эквивалентно - (Y, - (Y ', - (Y' ', Y' ''))). Который собирается просто расширяться навсегда, пока вы не свяжете семантический смысл с. Это то, что делает «-». –

1

Оба определения не работают должным образом.

Рассмотрим

?- pow(1, 1, 2). 

, который петли для обоих определений, так как второй пункт может быть применен независимо от второго аргумента. Сокращение в первом пункте не может отменить это. Второй пункт нуждается в цели Y > 0 перед рекурсивной целью. Использование (is)/2 по-прежнему является хорошей идеей для получения реальных решений.

Лучшее (для начинающих) должно начинаться с или и избегать в целом.

См .: например Prolog predicate - infinite loop

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

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