Анонимная переменная Prolog

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

  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]

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

ответы

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