Анонимная переменная Prolog
вот что я понял о переменных пролога.
одно подчеркивание означает анонимную переменную, которая при каждом ее возникновении похожа на новую переменную.
имя переменной, начинающееся с подчеркивания, например _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]
опять же, это только предупреждение. Если вы хотите, чтобы переменная, начиная с _
должно произойти дважды (без предупреждения), пишут . Но лучше придерживаться более значимых имен без начала _
.
ответы
то, что вы получаете от цикла верхнего уровня Prolog, - это ответы ; и, в частности, ответ замены. Они служат для представления решений (это то, что нас действительно интересует). Существует несколько способов представления замен ответов. Учебник, который вы используете, похоже, относится к очень старой версии SWI. Я бы сказал, что этой версии, возможно, от 15 до 20 лет.
?- append([1,2],X,Y).
X = _G189
Y = [1, 2|_G189]
однако ответ не является неправильным: новая вспомогательная переменная это.
более новые версии SWI и много других систем пробуют уменьшить вывод, избегая вспомогательных переменных. Так что
?- append([1,2],X,Y).
Y = [1, 2|X].
так же хорошо. Это ответ "новой" версии (также около 6 лет). Обратите внимание, что этот ответ говорит вам гораздо больше, чем первый: он не только показывает вам замену ответа более компактно, но и говорит вам, что есть ровно этот ответ (и не более). Смотрите точку .
в конце? Это означает: здесь больше нечего отвечать. В противном случае было бы ;
для следующий ответ.