пролог унарные числа - вычисляемое выражение

Я пытаюсь понять Пролог, и я попал в следующую ситуацию. Я определил натуральные числа (унарные) следующим образом:

n(0).
n(s(X)) :- nat(X).

Это означает, что 0 равно 0, s (0) равно 1, s (s (0)) равно 2 и т. Д.

Затем я определил предикат add:

add(0, Y, Y) :- nat(Y).
add(s(X), Y, s(Z)) :-
   add(X, Y, Z).

Это добавляет два унарных числа и результат к Z.

Теперь у меня есть следующий тест предиката, который демонстрирует мою проблему:

test(s(0),0).

Затем в интерпретации я печатаю:

add(s(0),0,R). %result: R = s(0), which is correct

Тогда я пробую:

test(add(s(0),0,R), 0).

Таким образом, первый аргумент должен привести к R = s (0), второй аргумент равен нулю, поэтому все выражение должно быть оценено как истинное, но пролог говорит ложь. Я предполагаю, что это как-то связано с тем, что add (s (0), 0, R) внутри тестового предиката не оценивает то, как я думаю. Может ли кто-нибудь объяснить мне это или, в конце концов, предоставить ссылку, описывающую это поведение? Спасибо за любую помощь! Ваше здоровье.


person Toby V.    schedule 19.03.2021    source источник
comment
Вы уверены, что хотите использовать noth, n/1 и nat/1?   -  person tiffi    schedule 19.03.2021
comment
То, что вы здесь написали, не ваша программа. С этой программой вопрос? - добавить (s (0), 0, R). ответит сообщение об ошибке.   -  person tiffi    schedule 19.03.2021


Ответы (1)


Нет, пролог работает не так, как вы предполагали. Когда вы спрашиваете

?- test(add(s(0),0,R), 0).

prolog пытается найти подходящее предложение. Однако в вашей базе данных нет соответствующего предложения, поскольку s(0) не соответствует add(s(0),0,R). Две структуры могут совпадать только в том случае, если у них один и тот же функтор.

s(0) имеет функтор s, а add(s(0),0,R) имеет функтор add.

person tiffi    schedule 19.03.2021