|?- ['test.pl'].
test.pl consulted 58 words 0.01 sec.
yes
Чтобы заставить Пролог считывать утверждения из файла, мы задаем вопрос, состоящий из имени файла, заключенного (в виде атома Пролога) в квадратные скобки. В данном случае это файл, состоящий из утверждений об отношении «нравится» (likes) между людьми.
|?- likes(john,bertrand).
no
|?- likes(john,albert).
no
Это просто ряд вопросов о том, кто кому нравится. Пролог не может найти в базе данных сопоставимых фактов.
|?- listing(likes).
likes(john,alfred).
likes(alfred,john).
likes(bertrand,john).
likes(david,bertrand).
likes(john,_l):- likes(_l,bertrand).
yes
Чтобы узнать, какие утверждения с заданным предикатом имеются в базе данных, мы задаем вопрос с помощью специального встроенного предиката listing. Этот специальный вопрос заставляет Пролог выдать все утверждения, содержащие предикат likes. Заметим, что неконкретизированные переменные Пролог выводит в виде литеры подчеркивания, за которой следует число. Последнее утверждение в базе данных было записано в файле в виде:
likes(john,X):- likes(X,bertrand).
Продолжим наш пример:
|?- likes(john,X).
X = alfred;
X = david;
no
Здесь, с помощью нажатия клавиш «;» и «RETURN» мы запрашиваем альтернативные ответы на заданный вопрос. Было выдано два возможных ответа; больше Пролог ничего не смог найти.
|?- likes(X,Y).
X = john,
Y = alfred;
X = alfred,
Y = john;
X = bertrand,
Y = john;
X = david,
Y = bertrand;
X = john,
Y = david;
no
На этот раз ответ системы состоит из значений, которыми конкретизированы обе переменные. И опять для получения альтернативных ответов мы вводим «;» и «RETURN» до тех пор, пока новых ответов не окажется.
|?- [user].
Теперь мы просим Пролог читать утверждения из файла user. Это означает, что утверждения следует читать с терминала. Прочитанные утверждения будут дописаны в конец базы данных. Перед вводом утверждений (в отличие от ввода вопросов) в качестве приглашения Пролог выдает символ «|» вместо «|?-».
[likes(timothy,bertrand).
|
user consulted 10 words 0.03 sec.
yes
После ввода первого утверждения мы сообщаем Прологу, что хотим прекратить чтение утверждений. Это делается путем одновременного нажатия клавиш «CONTROL» и «Z». При этом перед вводом комбинации «CONTROL Z» мы могли бы ввести не один, а несколько фактов и правил. Теперь Пролог завершил обработку предыдущего вопроса и ждет ввода нового.
|?- likes(john,X).
X = alfred;
X = david;
X = timothy;
no
Здесь мы снова просим выдать альтернативные ответы. Заметим, что ввод нового утверждения привел к появлению нового ответа, который ранее при том же вопросе не выдавался.
|?- likes(bertrand,Y).
Y = john
yes
Здесь показан другой способ работы с альтернативами. После первого ответа мы ввели «RETURN». Это привело к тому, что весь вопрос завершился успешно, и Пролог перешел к ожиданию следующего вопроса.
|?- core 36864 (7680 lo-seg + 29184 hi-seg)
heap 2560 = 1573 in use + 987 free
global 1177 = 16 in use + 1161 free
local 1024 = 16 in use + 1008 free
trail 511 = 0 in use + 511 free
0.36 sec. runtime
В ответ на последнее приглашение «|?-» мы ввели комбинацию «CONTROL Z», чтобы показать, что мы закончили работу с системой. В ответ Пролог выдал нам некоторую статистическую информацию, и мы снова вернулись в монитор TOPS-10. Полный протокол этого сеанса работы был записан в файл prolog.log.
Синтаксис
Синтаксис Пролога-10 в основном совпадает с нашим описанием, Правда, он несколько менее строг в отношении того, что считать правильными атомами и переменными, чем те правила, которые приведены в книге. Каждый пример из этой книги удовлетворяет требованиям синтаксиса Пролога-10. Приведем одно важное замечание относительно операторов с высоким приоритетом: поскольку ',' является оператором, то настоятельно рекомендуется во избежание двусмысленности заключать в скобки все термы, записанные с использованием операторов одинакового или более высокого приоритета. Это гарантирует, например, что конструкция
foo(a,b,c)
может быть истолкована только как структура с функтором too от трех аргументов, а не, например, что-нибудь типа
foo(a,','(b,c))
или
foo(','(a,','(b,c)))
Если бы мы хотели записать именно этот последний терм, то это следовало бы сделать так
foo((a,b,c))
Правило относительно операторов высокого приоритета касается только нескольких операторов, таких как ':-' и ';'. Оно означает, что запись вида:
?- retract(parent(A,B):- father(A,B)).
является синтаксически неправильной в смысле Пролога-10. Чтобы сделать ее правильной, нужно добавить пару скобок.
В том случае, если вы работаете с терминалом или с операционной системой, в которых не предусмотрено одновременного использования прописных и строчных букв, можно использовать имеющийся в Прологе-10 альтернативный вариант синтаксиса. В этом синтаксисе отличие переменных от атомов состоит в том, что имена переменных начинаются с литеры подчеркивания «_». Для перехода на этот вариант синтаксиса предусмотрен встроенный предикат nolc(нет строчных букв). Другой встроенный предикат, lс(строчные буквы), позволяет снова переключиться на нормальный синтаксис.
Читать дальше