Чтобы уточнить ответ Майкла Конвингтона: имена переменных Пролога, которые вы назначаете, не играют роли. Если для любого 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