Почему `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()в Прологе. Это не функция. Вам не нужно его определять. Это просто составной термин (найдите его). В некотором смысле это структура данных.

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