Чтобы уточнить ответ Майкла Конвингтона: имена переменных Пролога, которые вы назначаете, не играют роли. Если для любого X
выполняется предикат p(X)
, то то же самое верно для любых Y
и p(Y)
. Поэтому многие реализации пролога представляют переменную только целым числом, например SWI Prolog напечатан как _G123
, _G345
и т. Д. Опять же, в зависимости от того, какую реализацию вы используете, верхний уровень (приглашение, в котором вы вводите свой запрос) пытается быть умным в именах переменных: он знает, что внутренняя переменная _G123
соответствует S
и выбирает тот, который вы ввели:
?- X = f(Y).
X = f(Y).
Если я сделаю Y
анонимным (т.е. вообще не дам имя переменной), написав _
, я увижу внутреннее имя:
?- X = f(_).
X = f(_G123).
К сожалению, write/1
не знает столько, сколько верхний уровень, и использует внутреннее имя. Как я упоминал ранее, с логической точки зрения имя переменной не имеет значения. Следовательно, если вам нужен конкретный термин, вам нужно заменить атом: вы просто добавляете объединение S=spaceshuttle
к своей цели:
?- S = spaceshuttle, write(S).
spaceshuttle
S = spaceshuttle.
Средняя строка - это результат write/1
, а последняя строка - это подстановка вашего ответа. Что может вас смутить, так это то, что ваш код использует нотацию 'X'
для создания атома, который начинается с заглавной буквы - обычно это переменная. В этом случае вы просите 'X'
быть константой. Затем write также делает то, что вы ожидали:
?- write('S').
S
true.
Разницу легко увидеть, если попробовать несколько унификаций:
?- 'X' = 'Y'.
false.
?- f('X') = f('Y').
false.
?- X = Y.
X = Y.
?- f(X) = f(Y).
X = Y.
Атомы с разными именами никогда не могут быть одинаковыми, что приводит к «ложному». Но две переменные могут быть одинаковыми: верхний уровень просто дает вам условие (X равно Y, если переменные равны). Это выглядит немного круглым, но если вы попросите условие f(X) = f(Y)
, оно все равно будет сообщать вам, что вы должны заменить X
на Y
, т.е. всякий раз, когда вы заменяете X
чем-то, вам нужно заменить Y
на то же самое (что бы это ни было ).
Я также рекомендую взять учебник, который расскажет вам больше о сильных сторонах Prolog (унификация, возврат и т. Д.). В FAQ по comp.lang.prolog есть несколько полезных указателей (вопросы 8 и 14) .
10.09.2016
_G123
не, указывает на анонимную переменную. Единственная анонимная переменная -_
. В зависимости от системы Пролога, переменная, имя которой начинается с символа подчеркивания может не сообщаться как одноэлементная переменная, но это не то же самое, что и анонимная переменная. 11.09.2016