Функция преемника в Прологе

В вопросе, который я недавно столкнулся на экзамене по логическому программированию на университетском уровне, меня попросили запрограммировать предикат Пролог, 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
  1. Ли ! в первом выражении на самом деле служат какой-либо цели? Я знаю, что это предотвращает возврат после этой точки, но нет следующих выражений? Означает ли это, что алгоритм разрешения просто останавливается в этой точке?
  2. Я пытался реализовать 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).

это на самом деле самое простое рекурсивное определение для бесконечной области (положительных) целых чисел

Другие вопросы по тегам