Приложение 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] Между функтором и левой скобкой пробел не ставится.

Наши рекомендации