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

Вот что я понял о переменных 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]

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

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

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

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