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

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

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

11
nl ja de

1 ответы

переменные

The anonymous variable _ is the only variable where different occurrences represent different переменные. Other переменные that start with _ are not anonymous. Different occurrences refer to the same variable (within the same scope). However, many Prologs like SWI will warn you should a variable not starting with an underscore occur only once:

?- [user].
a(V).
Warning: user://1:9:
        Singleton переменные: [V]

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

a(_V,_V).
Warning: user://1:12:
        Singleton-marked переменные appearing more than once: [_V]

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

ответы

What you get from Prolog's top level loop are ответы ; and in particular answer substitutions. They serve to represent solutions (that's what we are really interested in). There are several ways how answer substitutions may be represented. The tutorial you are using seems to refer to a very old version of SWI. I would say that this version is maybe 15 to 20 years old.

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

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

Newer versions of SWI and many other systems try to minimize the output, avoiding auxiliary переменные. So

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

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

16
добавлено
Большой ответ :-))))))))
добавлено автор Gurkan E., источник