Я пытаюсь понять Пролог, и я попал в следующую ситуацию. Я определил натуральные числа (унарные) следующим образом:
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) внутри тестового предиката не оценивает то, как я думаю. Может ли кто-нибудь объяснить мне это или, в конце концов, предоставить ссылку, описывающую это поведение? Спасибо за любую помощь! Ваше здоровье.
n/1
иnat/1
? - person tiffi   schedule 19.03.2021