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