Пролог анонимной переменной

Вот что я понял о переменных Пролога.

  1. Одно подчеркивание обозначает анонимную переменную, которая каждый раз похожа на новую переменную.

  2. Имя переменной, начинающееся с подчеркивания, например _W, не является анонимной переменной. Или имена переменных, сгенерированные внутри Prolog, такие как _G189, не считаются анонимными:

?- append([1,2],X,Y).
X = _G189
Y = [1, 2|_G189]

Не могли бы вы помочь мне понять?

Кстати, я получил приведенный выше пример из некоторых руководств, но когда я запускаю его в SWI-Prolog версии 6, я получаю следующее:

?- append([1,2],X,Y).
Y = [1, 2|X].

Благодарю вас.

1 ответ

Решение

переменные

Анонимная переменная _ это единственная переменная, в которой разные экземпляры представляют разные переменные. Другие переменные, которые начинаются с _ не являются анонимными Различные вхождения ссылаются на одну и ту же переменную (в пределах одной и той же области видимости). Однако многие прологи, такие как SWI, предупреждают вас, если переменная, не начинающаяся с подчеркивания, встречается только один раз:

?- [user].
a(V).
Warning: user://1:9:
        Singleton variables: [V]

Вы должны переименовать эту переменную в _V чтобы избежать этого предупреждения. Это помогает программистам лучше находить опечатки в именах переменных. Есть еще несколько таких ограничений во многих системах.

a(_V,_V).
Warning: user://1:12:
        Singleton-marked variables appearing more than once: [_V]

Опять же, это только предупреждение. Если вы хотите, чтобы переменная начиналась с _ должно произойти дважды (без предупреждения), напишите __ вместо. Но лучше придерживаться более значимых имен без начала _,

ответы

Что вы получаете из цикла верхнего уровня Пролога, так это ответы; и, в частности, ответные замены. Они служат для представления решений (это то, что нас действительно интересует). Существует несколько способов представления замен ответов. Учебник, который вы используете, похоже, ссылается на очень старую версию SWI. Я бы сказал, что этой версии может быть от 15 до 20 лет.

?- append([1,2],X,Y).
X = _G189
Y = [1, 2|_G189]

Тем не менее, ответ не является неправильным: новая вспомогательная переменная _G189 вводится.

Более новые версии SWI и многих других систем пытаются минимизировать вывод, избегая вспомогательных переменных. Так

?- append([1,2],X,Y).
Y = [1, 2|X].

так же хорошо. Это ответ "более новой" версии (также около 6 лет). Обратите внимание, что этот ответ говорит вам гораздо больше, чем первый: он не только показывает вам подстановку ответа более компактно, но также говорит о том, что есть именно этот один ответ (и не более). Увидеть точку . в конце? Это значит: здесь больше нет ответа. В противном случае было бы ; для следующего ответа.

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