Приложение 2. встроенные предикаты и операторы
Предикат/оператор | Описание |
write(Term) | Вывести в текущий поток вывода Term. |
read(Term) | Извлечь из текущего потока вывода следующий терм и унифицировать его с Term. Ввод дожжен заканчиваться точкой. |
tell(File) | Открыть файл для записи и перевести на него текущий поток вывода. |
told | Перевести текущий поток вывода на стандартный поток вывода. |
see(File) | Открыть файл для чтения и перевести на него текущий поток ввода. |
seen | Перевести текущий поток ввода на стандартный поток ввода. |
append(List1,List2, List3) | Успешен, когда список List3 унифицируем с объединением списков List1 и List2. Все аргументы могут быть свободными переменными. Результат унификация соответствующих списков. |
append(ListOfLists, List) | Успешен, когда объединение списка списков ListOfLists унифицируем со списком List. Результат: унификация соответствующих списков. |
member(Elem, List) | Успешен, когда Elem унифицируем с одним из элементов списка List. Результат – унификация соответствующего элемента списка с Elem. |
nextto(X, Y, List) | Успешен, когда Y следует непосредственно за X в списке List. |
delete(List1, Elem, List2) | Удалить все элементы списка List1 унифицируемые с Elem. Результат помещается в List2. |
select(Elem, List, Rest) | Успешен, когда Rest является списком List с удалённым элементом Elem. То есть этим предикатом можно удалять и вставлять элементы списка. Пример: ?- select(a,L,[1,2,3]). L = [a, 1, 2, 3] ; L = [1, a, 2, 3] ; L = [1, 2, a, 3] ; L = [1, 2, 3, a] ; false. |
nth0(Index, List, Elem) | Успешен, когда элемент спика List с номером Index унифицируем с Elem. Отсчёт номеров элементов начинается с 0. |
nth1(Index, List, Elem) | Тоже, что и nth0/3, но отсчёт номеров элементов начинается с 1 |
last(List, Elem) | Успешен, когда Elem унифицируется с последним элементом списка List. Если хвост списка List не определён, то при бектрекинге хвост будет увеличиваться. |
reverse(List1, List2) | Изменяет порядок элементов List1 и унифицирует результат с List2. |
permutation(List1, List2) | Успешен, когда список List1 образован из списка List2 перестановкой элементов. |
sumlist(List, Sum) | Унифицирует Sum с суммой элементов списка List. |
max_list(List, Max) | Унифицирует Max с максимальным элементом списка List. |
min_list(List,Min) | Унифицирует Min с минимальным элементом списка List. |
IntExpr1 mod IntExpr2 | Остаток от деления IntExpr1 на IntExpr2. |
IntExpr1 // IntExpr2 | Целая часть от деления IntExpr1 на IntExpr2 |
sleep(Time) | Приостановление выполнения на Time секунд. |
Term =.. List | Выражение истинно когда терм Term инициализируется с термом соответствующим списку List, головой которого является функтор терма, а оставшийся хвост представляет собой список аргументов терма. Пример: ?- a(b(1),2,3,X)=..L. L = [a, b(1), 2, 3, X]. ?- a(b(1),2,3,X)=..[a,b(X)|_]. X = 1. ?- a(Y,2,3,X)=..[a,b(2)|_]. Y = b(2). ?- Term=..[a,b,c(4),1,2,3,X]. Term = a(b, c(4), 1, 2, 3, X). Таким образом с помощью данного оператора можно конструировать термы из элементов и «разбирать» их на элементы. |
call(Goal) | «Запустить на выполнение» предикат хранящийся в Goal. Этот предикат может потребоваться, например, после конструирования предиката предыдущим оператором. Пример: ?- assert(a(1)). ?-read(Y),X=..[a,Y],call(X) . |: 1. Y = 1, X = a(1). ?- read(Y),X=..[a,Y],call(X) . |: 23. false. |
op(Precedence, Type, Name) | Объявление операторной формы с именем Name, приоритетом Precedence и типом Type для предиката с именем Name. Новые операторы можно вводить для увеличения удобства записи нужных предикатов (пример на с. 17) |
Больше информации о встроенных предикатах можно найти во встроенной в SWI-Prolog англоязычной справке. Для доступа к ней из командного окна выбрать меню Help->Online Manual либо набрать запрос ?-help. Поиск в справке (по функтору) можно осуществлять в нижнем поле поиска.
ЛИТЕРАТУРА
1. Хоггер К. Введение в логическое программирование. - М.: Мир, 1988. - 349 с.
2. Клоксин У., Меллиш К. Программирование на языке Пролог. - М.: Мир, 1987. - 336 с.
3. Стерлинг Л., Шапиро Э. Искусство программирования на языке Пролог. - М.: Мир, 1989, - 235 с.
4. Братко И. Программирование на языке Пролог для искусственного интеллекта. - М.: Мир, 1990. - 560 с.
5. Ковальски Р. Логика в решении проблем. - М.: Наука, 1990. - 280 с.
6. Малпас Дж. Реляционный язык Пролог и его применение. - М.: Наука, 1990.- 464 с.
7. Стобо Д.Ж. Язык программирования Пролог. - М.: Радио и связь, 1993. - 368 с.
1. ЗНАКОМСТВО С SWI/PROLOG. ЗАПУСК ПРОСТОЙ ПРОГРАММЫ... 3
1.1. ГЛАВНОЕ МЕНЮ... 3
1.2. ПЕРВАЯ ПРОГРАММА.. 3
1.3. ИСПОЛЬЗОВАНИЕ ВСТРОЕННЫХ ПРЕДИКАТОВ.. 8
1.4. ВЫПОЛНЕНИЕ И ТРАССИРОВКА ПРОГРАММЫ... 9
2. СТРУКТУРЫ ДАННЫХ. СЛОЖНЫЕ УТВЕРЖДЕНИЯ В ПРОЛОГЕ.. 16
2.1. СТРУКТУРА ЯЗЫКА.. 16
2.2. СОСТАВНЫЕ ЦЕЛИ-ЗАПРОСЫ... 16
2.3. СОСТАВНЫЕ ОБЪЕКТЫ... 17
2.4. ОТРИЦАНИЕ В ПРОЛОГЕ.. 18
3. РЕКУРСИЯ В ПРОЛОГЕ.. 20
3.1. РЕКУРСИЯ.. 20
3.2. ПРОГРАММИРОВАНИЕ С НАКОПИТЕЛЯМИ.. 23
3.3. РЕКУРСИВНЫЕ ОБЪЕКТЫ... 24
4. УПРАВЛЕНИЕ ЛОГИЧЕСКИМ ВЫВОДОМ... 24
4.1. ОТСЕЧЕНИЕ(CUT) 24
4.2. ОРГАНИЗАЦИЯ ЦИКЛА BAF-МЕТОД.. 26
4.3. ОРГАНИЗАЦИЯ ЦИКЛА UDR-МЕТОД.. 27
4.4. ИСПОЛЬЗОВАНИЕ НАДРЕЗОВ (SNIP) 28
5. СПИСКИ.. 30
6. МОДИФИКАЦИЯ УТВЕРЖДЕНИЙ ПРОГРАММЫ. РАБОТА С БАЗОЙ ДАННЫХ. 32
7. ПРИЛОЖЕНИЕ 1. ТИПЫ ДАННЫХ SWI/PROLOG.. 36
7.1. ПЕРЕМЕННЫЕ.. 36
7.2. СИМВОЛЬНЫЕ КОНСТАНТЫ ИЛИ АТОМЫ... 36
7.3. ЦЕЛЫЕ ЧИСЛА. 37
7.4. РАЦИОНАЛЬНЫЕ ЧИСЛА.. 37
7.5. ЧИСЛА С ПЛАВАЮЩЕЙ ТОЧКОЙ.. 38
7.6. СТРОКИ.. 38
7.7. СТРУКТУРЫ... 38
8. ПРИЛОЖЕНИЕ 2. ВСТРОЕННЫЕ ПРЕДИКАТЫ И ОПЕРАТОРЫ. 39
ЛИТЕРАТУРА.. 42
[1] Не вводите имя файла с расширением без апострофов.
[2] Отладка происходит в командной строке в диалоговом окне SWI/PROLOG-а и отображает последовательность выполняемых подцелей и результат выполнения.
[3] Графический отладчик отображает информацию в собственном – отдельном окне.
[4] Не забывайте каждый раз ставить точку после предикатов или группы предикатов (записанных через запятую) – каждое предложение заканчивается точкой.
[5] До последнего правила вывод дойдет только, если X>0, во всех остальных случаях это правило не будет даже рассматриваться как альтернатива в точке возврата (точка будет заморожена после выполнения операции отсечения).
[6] Не забывайте ставить точки в конце вводимых слов.
[7] Т.е. «замораживаются» точки возврата только для предикатов внутри надреза.
[8] Не путать символ апострофа (') с двойной кавычкой (").
[9] Между функтором и левой скобкой пробел не ставится.