Пролог анонимной переменной
Вот что я понял о переменных Пролога.
Одно подчеркивание обозначает анонимную переменную, которая каждый раз похожа на новую переменную.
Имя переменной, начинающееся с подчеркивания, например _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 лет). Обратите внимание, что этот ответ говорит вам гораздо больше, чем первый: он не только показывает вам подстановку ответа более компактно, но также говорит о том, что есть именно этот один ответ (и не более). Увидеть точку .
в конце? Это значит: здесь больше нет ответа. В противном случае было бы ;
для следующего ответа.