Функция преемника в Прологе
В вопросе, который я недавно столкнулся на экзамене по логическому программированию на университетском уровне, меня попросили запрограммировать предикат Пролог, odd/1
, который определяет, является ли данное значение нечетным.
Реализация должна была использовать уже заданный предикат s/1
, который оценил бы для преемника (то есть X + 1) данного элемента. Это было решение, данное для реализации odd/1
сказуемое:
odd(s(0)):-!. % 1 is the first odd number
odd(s(s(X))):- odd(X). % A number s(s(X)) (i.e X + 2) is odd if X is odd as well
- Ли
!
в первом выражении на самом деле служат какой-либо цели? Я знаю, что это предотвращает возврат после этой точки, но нет следующих выражений? Означает ли это, что алгоритм разрешения просто останавливается в этой точке? - Я пытался реализовать
s/1
Предикат преемника ради практики, но не смог этого сделать. (Как) Можно ли реализовать этот предикат в Прологе?
1 ответ
Решение
Вот след без среза
[trace] 21 ?- odd(s(s(s(0)))).
Call: (6) odd(s(s(s(0))))
Call: (7) odd(s(0))
Exit: (7) odd(s(0))
Exit: (6) odd(s(s(s(0))))
true ;
Redo: (7) odd(s(0))
Fail: (7) odd(s(0))
Fail: (6) odd(s(s(s(0))))
false.
а вот с разрезом
[trace] 22 ?- odd(s(s(s(0)))).
Call: (6) odd(s(s(s(0))))
Call: (7) odd(s(0))
Exit: (7) odd(s(0))
Exit: (6) odd(s(s(s(0))))
true.
Я думаю, что сокращение было добавлено для эффективности...
Что касается s/1, то это не предикат, а структура данных. Может быть, вы видели что-то вроде
integer(0).
integer(s(X)) :- integer(X).
это на самом деле самое простое рекурсивное определение для бесконечной области (положительных) целых чисел