Почему `f(a)=a` не работает, а` f(X)=X` преуспевает в прологе?
Я наткнулся на следующее:
?- f(X) = X.
X = f(X).
?- f(a) = a.
false.
Почему унификация работает для
f(X) = X
, но не для
f(a) = a
? Это потому, что сначала просто говорит имя возвращаемое значение
f(X)
в качестве
X
, тогда как второй пытается проверить, возвращает ли возвращаемое значение
f(a)
является
a
? Но
f()
здесь не определено !! Также, думаю, в прологе нет такого понятия, как «возвращаемое значение». Тогда что здесь происходит?
1 ответ
В вашем первом примере
X
- переменная (идентификатор начинается с заглавной буквы, найдите его). Свободная переменная объединяется с чем угодно. (почти все. Вы создаете циклический термин, это не сработает, если вы попытаетесь «объединить с проверкой возникновения», найдите это).
Во втором примере это атом. Он объединяется только со свободной переменной или с самим собой. С
f(a)
не является
a
объединение терпит неудачу.
Вы правы, что такого понятия как «возвращаемое значение» не существует. Вы можете рассматривать успех или неудачу цели как «возвращаемое значение», но я не знаю, насколько это помогает.
В любом случае нет
f()
в Прологе. Это не функция. Вам не нужно его определять. Это просто составной термин (найдите его). В некотором смысле это структура данных.