- •Основы логического и функционального программирования
- •2.1. Введение 46
- •Основы логического программирования
- •Введение
- •Предложения: факты и правила
- •Запросы
- •Предикаты
- •Переменные
- •Основные секции программы
- •Основные стандартные домены
- •Поиск с возвратом
- •Управление поиском с возвратом: предикаты ! и fail
- •Рекурсия
- •Составные объекты
- •Деревья
- •Динамические базы данных
- •Основы функционального программирования
- •Введение
- •Символьные выражения
- •Списки.
- •Функции
- •Базовые функции
- •Управляющие структуры (предложения)
- •Простая рекурсия
- •Другие виды рекурсии
- •Литература
Динамические базы данных
PDC Prolog поддерживает различные стандартные предикаты для обработки строк. Основными предикатами для работы со строками можно назвать предикат frontchar (String, Char, StringRest), позволяющий разделить строку String на первый символ Char и остаток строки StringRest и предикат fronttoken (String, Lexeme, StringRest), который работает аналогично предикату frontchar, но только отделяет от строки String лексему Lexeme. Лексемой называется последовательность символов, удовлетворяющая следующим условиям: имя в соответствии с синтаксисом Prolog’а, число или отличный от пробела символ.
Пример: преобразование строки в список символов (Два варианта. Варианты отличаются друг от друга граничным условием рекурсии. В первом варианте остановка рекурсии происходит, когда от строки будет отделен последний символ и строка станет пустой строкой. Во втором варианте остановка рекурсии происходит в момент попытки отделения от пустой строки очередного символа, что сделать не удается, и происходит откат ко второму предложению).
%1 вариант
DOMAINS
charlist=char*
PREDICATES
string2charlist (string, charlist)
CLAUSES
string2charlist (“”, [ ]):- !.
string2charlist (Str, [H|T]):- frontchar (Str, H, Str_Rest), string2charlist (Str_Rest, T).
GOAL
string2charlist (“abcde”, List), write (“List=”, List).
%2 вариант
DOMAINS
charlist=char*
PREDICATES
string2charlist (string, charlist)
CLAUSES
string2charlist (Str, [H|T]):- frontchar (Str, H, Str_Rest), !, string2charlist (Str_Rest, T).
string2charlist (_, [ ]).
GOAL
string2charlist (“abcde”, List), write (“List=”, List).
Результат работы программы:
List=[‘a’, ‘b’, ‘c’, ‘d’, ‘e’]
Более подробно стандартные предикаты для работы со строками можно посмотреть в файле Prolog.hlp в разделах “STRING HANDLING” и “CONVERSIONS”.
Основы функционального программирования
Введение
Язык Lisp является языком функционального программирования. В Lisp’е как программы, так и данные, представляются одинаково – в виде списков. Например, запись (+ 1 2) может толковаться, в зависимости от контекста, как список, состоящий из трех элементов (данные), или как вызов функции суммирования с двумя аргументами (программа).
О такой особенности Lisp’а говорит и название языка, ведь аббревиатура Lisp произведена от слов LISt Processing (обработка списков). То есть, программы, написанные на Lisp’е, могут обрабатывать и преобразовывать как другие программы, так и самих себя.
Символьные выражения
При написании программ на Lisp’е используются символы и создаваемые на основе символов символьные выражения. Символ в Lisp’е аналогичен переменной в традиционном языке программирования – это имя, состоящее из букв латиницы, цифр и некоторых специальных литер. Символ, как и переменная, может иметь какое-либо значение, то есть представлять какой-либо объект.
Наряду с символами, в Lisp’е используются также: