?- X = Y, X == Y. X = _23, Y = _23
?- присоединить([А|В],С) == присоединить(Х,Y).
нет
?- присоединить ([А|В],С) == присоединить([А|В],С).
А = _23, В = _24, С = _25
Этот предикат находится в таком же отношении с '==' как '\=' с '='. Это значит, что целевое утверждение, содержащее этот предикат, согласуемо в точности тогда, когда целевое утверждение с '==' не согласуемо, и наоборот. И вновь мы могли бы считать, что этот предикат определен на Прологе следующим образом:
Х\== Y:- X == Y,!, fail.
Х\== Y.
6.9. Ввод и вывод данных
Предикаты для ввода и вывода литер и термов обсуждались в гл. 5. Здесь мы резюмируем наши знания о каждом из этих предикатов.
Это целевое утверждение согласуется с базой данных, если X может быть сопоставлена с очередной литерой в текущем входном потоке данных. Цель get0 выполняется лишь один раз (его нельзя согласовать повторно). Операция перехода к очередной литере не переделывается при возврате, так как не существует способа поместить литеру обратно в текущий входной поток данных.
Это целевое утверждение согласуется с базой данных, если переменная X может быть сопоставлена с очередной печатаемой (неуправляющей) литерой в текущем входном потоке данных. Печатаемые литеры имеют код ASCII, превышающий 32. Все управляющие литеры пропускаются. Предикат get выполняется только один раз (он не может быть согласован вновь). Результат get не устраняется при возврате, так как нет способа поместить литеру обратно в текущий входной поток данных.
Этот предикат читает и пропускает литеры в текущем входном потоке данных до тех пор, пока не встретится литера, сопоставимая с X. Предикат skip выполняется только один раз.
Этот предикат читает очередной терм из текущего входного потока данных и сопоставляет его с X. Предикат read выполняется только один раз. Вводимый терм должен заканчиваться точкой '.' которая не становится частью этого терма. После точки должна следовать по крайней мере одна управляющая литера. Точка удаляется из текущего входного потока данных.
Этот предикат записывает целое число X в виде литеры (кодом которой и является X) в текущий выходной поток данных. Предикат put выполняется только один раз. Если X неконкретизирован, то фиксируется ошибка.
Записывает в текущий выходной поток данных последовательность управляющих литер, вызывающую переход на «новую строку». В случае вывода на дисплей все литеры, выводимые после nl, будут размещены на следующей строке страницы; nl выполняется только один раз.
Записывает X «пробелов» в текущий выходной поток данных. Если X неконкретизирован, то фиксируется ошибка, tab выполняется только один раз.
Этот предикат записывает терм X в текущий выходной поток данных, write выполняется только один раз. Каждая неконкретизированная переменная, входящая в X, записывается как уникальное имя, начинающееся с подчеркивания ('_'), за которым следует уникальное число, как, например, '_239'. Переменные, сцепленные в пределах одного аргумента предиката write, при печати будут иметь одинаковые имена. Предикат write учитывает при печати термов имеющиеся объявления операторов. Так, например, инфиксный оператор будет напечатан между своими аргументами.
Предикат display работает в точности таким же способом, что и write, за тем исключением, что он игнорирует все объявления операторов. Предикат display печатает любую структуру, начиная с ее функтора, за которым в круглых скобках печатается список аргументов.
Этот предикат объявляет оператор, имеющий приоритет X, позицию и ассоциативность Y и имя Z. Спецификация позиции и ассоциативности выбирается из числа следующих атомов:
fx fy xf yf xfx xfy yfx yfy
Если объявление оператора корректно, то op считается согласованным. Более подробно этот предикат описан в разд. 5.5.
6.10. Обработка файлов
Предикаты для изменения текущего входного и текущего выходного потоков данных были введены в гл. 5. Здесь мы резюмируем наши знания о каждом из этих предикатов.
Этот предикат открывает файл X, если он еще не открыт, и определяет, что текущим входным потоком данных становится файл X. Если X неконкретизирована или X конкретизирована именем несуществующего файла, то фиксируется ошибка.
Это целевое утверждение согласуется с базой данных, если имя текущего входного потока данных (файла) сопоставимо с X, и не согласуется в противном случае.
Этот предикат закрывает текущий входной поток данных (файл) и определяет, что текущим входным потоком данных становится клавиатура терминала (user).