- •127994, Москва, ул. Образцова, 15
- •2.Теоретические основы логическоого программирования
- •2.1.Логика высказываний и логика предикатов.
- •2.1.1.Формулы. Синтаксис и семантика формул.
- •2.1.2.Интерпретация формул в логике высказываний.
- •2.1.3.Интерпретация в логике предикатов первого порядка
- •2.1.4.Равносильность формул логики высказываний
- •2.1.5.Тождественная истинность формул логики высказываний
- •2.1.6.Равносильность формул логики первого порядка
- •2.1.7.Тождественная истинность, общезначимость, выполнимость, противоречивость формул логики предикатов
- •2.1.8.Рассуждения в логике высказываний (предикатов)
- •2.2.Метод резолюций
- •2.2.1.Метод резолюций в логике высказываний
- •2.2.2.Подстановка и унификация
- •2.2.3.Метод резолюций для логики первого порядка
- •2.2.4.Стратегии метода резолюций
- •2.3.Отношения и предикаты
- •3.Пролог- язык РекуРсивно-логического программирования
- •3.1.Пролог-история возникновения
- •3.2.Синтаксис языка пролог
- •3.3.Семантика языка пролог
- •3.4.Язык пролог и метод резолюций. Логическая интерпретация языка Пролог.
- •3.5.Работа в пролог-системе
- •3.6.Описание инфиксных операций
- •3.7.Списки в языке пролог
- •3.8.Арифметика в языке пролог
- •3.9.Отсечение и отрицание в языке пролог
- •3.10.Встроенные предикаты языка пролог
- •3.11.Работа с базой данных в языке пролог
- •3.12.Предикаты поиска
- •3.13.Решение головоломки на языке пролог(задача Эйнштейна)
- •4.Лабораторные работы по РекуРсивно-логическому программированию
- •4.1.Задание n1 Отношения между объектами. (на Прологе и Паскале)
- •4.1.1.Методические указания
- •4.1.2.Варианты
- •4.2.Задание n2. Работа со списками
- •4.2.1.Методические указания
- •4.2.2.Варианты
- •4.3.Задание n3. Разные задачи
- •4.3.1.Методические указания
- •4.3.2.Варианты
- •4.4.Содержание отчета
3.10.Встроенные предикаты языка пролог
Ввод и вывод
В каждый момент выполнения пролог-программы два файла являются "активными": один для ввода, другой - для вывода. Эти два файла называются текущим входным и выходным потоками соответственно. В начальный момент эти два потока соответствуют терминалу. Основные предикаты:
see(ИмяФайла) - заменяет текущий входной поток на другой файл;
tell(ИмяФайла) - заменяет текущий выходной поток на другой файл;
seen - закрывает текущий входной файл;
told - закрывает текущий выходной файл.
Файлы обрабатываются последовательно. Каждый запрос на чтение из входного файла приводит к чтению в текущей позиции текущего входного потока. После этого текущая позиция будет перемещена на следующий симол. Если запрос на чтение делается в конце файла, то в качестве ответа на такой запрос выдается атом end_of_file.
read(X) - вызывает чтение следующего терма Т и сопоставление его с X.
Если Х - переменная, то в результате Х конкретизируется и становится равным Т. Если сопоставление терпит неудачу, цель read(X) тоже терпит неудачу.
write(X) - выведет терм Х в текущий выходной файл.
Х будет выведен в той же форме, в какой пролог-система изображает значения переменных.
tab(N) - выводит N пробелов;
nl - приводит к переходу на новую строку.
Пример 3.10.1. Представление списка целых чисел в виде диаграммы.
Описание программы:
диагр([N | L]):- звездочки(N), n1, диагр(L).
диагр([]).
звеэдочки(N):- N > 0, write(*), Nl is N - 1, звездочки(Nl).
звездочки(N):- N<=80.
Пример использования:
?- диагр( [3, 4, 6, 5]).
***
****
******
*****
get0(С) - читать символ из текущего входного потока;
get(С) - читать символ из текущего входного потока c пропускjv всех непечатаемых символов (в частности пробелов);
put(С) - вывести символ в текущий выходной поток.
Проверка типов термов
Следующие предикаты заканчиваются успешно, если:
var(X) - Х в текущий момент не получила значения;
nonvar(X) - Х - терм, отличный от переменной, или если Х - уже получила значения;
atom(X) - Х обозначает атом или переменную, имеющую атом в качестве значения;
integer(X) - Х обозначает целое или переменную, имеющую целое в качестве значения;
atomic(X) - Х обозначает целое или атом или переменную, имеющую такие значения.
Пример 3.10.2. Вычисление недостающего элемента в равенстве X=Y+Z.
Описание программы:
сумма(X,Y,Z):- integer(X), integer(Y), Z is X-Y.
сумма(X,Y,Z):- integer(Z), integer(Y), X is Y+Z.
сумма(X,Y,Z):- integer(X), integer(Z), Y is X-Z.
Пример использования:
?- сумма(X,2,3).
X=5
?- сумма(2, X,3).
X=-1
?- сумма(2,3, X).
X=-1
Создание и декомпозиция термов
Инфиксное отношение «=..» сопоставляет структуру со списком.
Предикат «Терм =.. L.» заканчивается успешно, если L - список, начинающийся с главного функтора терма Терм, вслед за которым идут его аргументы.
Пример 3.10.3.
?- f(а, b) =..L.
L=[f, а, b]
?- а=..L.
L=[а]
?- Т=..[прямоугольник, 3, 5].
Т=прямоугольник( 3, 5)
?- Z=..[р, X, f( X,Y)].
Z = p(X, f(X,Y))
functor(Терм, F, N) заканчивается успешно, если F - главный функтор Tepмa, а N -арность F.
arg(N, Терм, А) заканчивается успешно, если А - N-й аргумент в Терме.
Пример 3.10.4.
?- functor( t( f( x), X, t), Фун, Арность).
Фун = t
Арность = 3
?- аrg( 2, f( X, t( a), t( b) ), Y).
Y = t( a)
?- functor( D, дата, 3), arg( 1, D, 29), arg( 2, D, июнь), arg( 3, D, 1982).
D = дата( 29, июнь, 1982)
name(A, L) заканчивается успешно, если L - список кодов символов, входящих в состав атома А.
Пример 3.10.5.
?- name(abcbd,L).
L = [97, 98, 99, 98, 100]
?- name(X,[97, 98, 99, 98, 100]).
X = abcbd
?- name(A,[a,b,c,d]).
X = abcd
