Составители:
Рубрика:
16
Будет получен утвердительный ответ, поскольку такой факт явно
описан в программе. Если же сделать запрос,
? doroje(evro, iena).
То ответ будет отрицательный, поскольку такой факт отсутствует.
Аналогичным будет ответ на вопрос:
? doroje(funt, rubl).
Избежать противоречий здесь можно введением правила, в котором
допустимо сравнение между собой не только двух, но и трех объектов:
doroje1(X, Y):- doroje(X, Y). /* два объекта */
doroje1(X, Y):- doroje(X, Z), doroje(Z, Y). /* три объекта */
Второе правило описывает, очевидно, вариант, когда X>Z, а Z>Y,
откуда делается вывод, что X>Y.
Однако цепочка взаимных сравнений может быть длинной. Напри-
мер, при четырех сравнениях потребуется конструкция:
doroje2(X, Y):- doroje(X, M), doroje(M, K), doroje(K, Z), doroje(Z, Y).
Описывать такие длинные правила неудобно. Здесь выгоднее при-
менить рекурсию, обратившись к правилу из самого этого правила:
doroje1(X, Y):- doroje(X, Y).
doroje1(X, Y):- doroje(X, Z), doroje1(Z, Y).
Первое предложение в этой конструкции определяет момент пре-
кращения рекурсивных вызовов.
Второе правило описывает возможности рекурсивных вызовов, ког-
да существуют непроверенные варианты решения.
Вообще, любая рекурсивная процедура должна содержать хотя бы
одну из двух компонент:
1. Нерекурсивную фразу, определяющую правило, применяемое в
момент прекращения рекурсии.
2. Рекурсивное правило, первая подцель которого вырабатывает но-
вые значения аргументов, а вторая – рекурсивная подцель – использует
эти значения.
База правил просматривается сверху вниз. Сначала делается попытка
выполнения нерекурсивной фразы. Если условие окончания рекурсии
не указано, то правило может работать бесконечно. Например:
Страницы
- « первая
- ‹ предыдущая
- …
- 16
- 17
- 18
- 19
- 20
- …
- следующая ›
- последняя »