Пример 15.11. Работа с составными величинами
(create$ hammer drill saw screw pliers wrench) (create$ (+ 34) (* 2 3) (/84)) (nth$ 3 (create$ a b с d e f g)) (nth$ 10 (create$ a b с d e f g)) (member$ blue (create$ red 3 "text" 8.7 blue)) (member$ 4 (create$ red 3 "text" 8.7 blue)) (member$ (create$ b c) (create$ abed)) (subsetp (create$ hammer saw drill) (create$ hammer drill wrench pliers saw)) (subsetp (create$ wrench crowbar) (create$ hammer drill wrench pliers saw))
Рис. 15.11. Работа с составными величинами Функции explode$ и implode$ предназначены для преобразования строки в составную величину и составной величины в строку соответственно. Пустая строка создает составную величину нулевой длины. Элементы строки типов, отличных от symbol, string, integer, float или instance-name (например, переменные), преобразуются в тип string. Синтаксис и примеры использования этих функций приведены ниже (см. также рис. 15.12). Определение 15.36. Функции explode$ и implode$
(explode$ <строковое выражение>) (implode$ <составная-величина>) Пример 15.12. Использование функций еxplode$ и implode$ (explode$ "hammer drill saw screw") (explode$ "1 2 abc 3 4 \"abc\" \"def\"") (explode$ "?x ~)") (implode$ (create$ hammer drill screwdriver)) (implode$ (create$ 1 "abc" def "ghi" 2)) (implode$ (create$ "abc def ghi"))
Рис. 15.12. Использование функций explode$ и implode$
Функция delete$ удаляет выбранные поля из составной величины и возвращает модифицированную составную величину, из которой удален отрезок, заданный индексами своего первого и последнего элемента. Если требуется удалить одно поле, то индекс начала отрезка должен совпадать с индексом конца. Определение 15.37. Функция delete$ (delete$ <составная-величина> <индекс-начала> <индеке-конца>) Для извлечения подпоследовательности из составной величины служит функция subseq$. Определение границ извлекаемой подпоследовательности происходит так же, как и у функции delete$.
Определение 15.38. Функция subseq$ (subseq$ <составная-величина> <индекс-начала> <индекс-конца>) Функция replace$ предназначена для замены выбранного диапазона элементов составной величины на заданную простую или составную величину. Функция возвращает новую составную величину, содержащую измененный фрагмент. Определение 15.39. Функция replace$ (replace$ <изменяемая-составная-величина> <индекс-начала> <индекс-конца> <простая-или-составная-величина>+) Для добавления нескольких простых или составных величин в заданное место некоторой составной величины предназначена функция insert$. Определение 15.40. Функция insert$ (insert$ <изменяемая-составная-величина> <индекс-начала> <простая-или-составная-величина>+) В качестве второго параметра эта функция принимает целое число, являющееся индексом, начиная с которого в заданную составную величину будут добавлены новые поля. Примеры использования этой и остальных функций, изменяющих содержание составной величины, приведены ниже (см. также рис. 15.13). Пример 15.13. Использование функций, изменяющих содержание составной величины (delete$ (create$ hammer drill saw pliers wrench) 3 4) (delete$ (create$ computer printer hard-disk) 1 1) (subseq$ (create$ hammer drill wrench pliers) 3 4) (subseq$ (create$ 1 "abc" def "ghi" 2) 1 1) (replace$ (create$ drill wrench pliers) 3 3 machete) (replace$ (create$ abed) 2 3 x у (create$ q r s)) (insert$ (create$ abed) 1 x) (insert$ (create$ abed) 4 у z) (insert$ (create$ abed) 5 (create$ q r))
Рис. 15.13. Использование функций, изменяющих содержание составной величины Для работы с составными переменными в рамках парадигмы списков, которая часто используется в различных логических языках программирования, например Пролог, CLIPS предоставляет функции first$ и rest$. Синтаксис этих функций и примеры приведены ниже (см. также рис. 15.14). Определение 15.41. Функции first$ и rest$
(first$ <составная-величина>) (rest$ <составная-величина>) Первая функция возвращает в качестве составного значения первое поле заданной составной величины, а вторая — заданную составную величину без первого поля. Пример 15.14. Использование функций first$ и rest$
(first$ (create$ abc)) (first$ (create$)) (rest$ (create$ a b с)) (rest$ (create$)) Рис. 15.14. Использование функций first$и rest$ Функция length$ возвращает число полей (целый тип), содержащихся в составной величине. Если параметр length$ не соответствует необходимому типу, функция возвращает — 1. Определение 15.42. Функция length$ (length$ <составная-величина>) Функция delete-member$ удаляет все вхождения заданных пользователем элементов или составных величин из начальной составной величины. Определение 15.43. Функция delete-member$ (delete-member$ <составная-величина> <выражение>+) Для замены всех вхождений элементов или составных величин из начальной составной величины на некоторое выражение служит функция replace-member$. Первым аргументом этой функции является исходная составная величина. Второй аргумент задает простое или составное значение, на которое будут заменены все найденные вхождения. Третий аргумент определяет произвольное количество простых или составных элементов, которые необходимо найти и заменить в исходной составной величине. Определение 15.44. Функция replace-member$ (replace-member$ <составная-величина> <выражение> <>) Ниже представлены примеры использования функций delete-member$ и replace-member$ (см. также рис. 15.15). Пример 15.15. Использование функций delete-member$ и replace-member$ (delete-member$ (create$ a b a c) b a) (delete-member$ (create$ a b с с b a) (create$ b a)) (replace-member$ (create$ a b a b) (create$ a b a) a b) (replace-member$ (create$ a b a b) (create$ a b a) (create$ a b))
Рис. 15.15. Использование функций delete-member$ и replace-member$ 15.5. Функции ввода/вывода
Система ввода/вывода, используемая CLIPS, называется маршрутизацией ввода/вывода (I/O routers). Одна из ключевых особенностей системы маршрутизации ввода/вывода — использование логических имен. Логическиеимена позволяют обращаться к устройствам ввода/вывода унифицированным способом, без необходимости учета особенностей конкретного устройства. Многие функции CLIPS используют логические имена в качестве параметров. Логическое имя, созданное пользователем, должно быть строкой, числом или принадлежать типу symbol. CLIPS предоставляет несколько предопределенных логических имен, список которых приведен в табл. 15.8. Таблица 15.8. Предопределенные логические имена CLIPS
Подробную информацию о логических именах и системе маршрутизации ввода/вывода можно найти в книге "CLIPS Reference Manual, Volume II, Advanced Programming Guide ". Описание функций ввода/вывода, предоставляемых системой CLIPS, приведены в табл. 15.9. Таблица 15.9. Функции ввода/вывода
Функция open предоставляет пользователю возможность открыть файл в функции или из правой части правила и присвоить файлу определенное логическое имя. Эта функция принимает три аргумента: имя открываемого файла, логическое имя, которое будет использоваться системой ввода/вывода CLIPS для связи с этим файлом и, наконец, параметр, определяющий способ открытия файла. Возможные варианты значений аргумента, определяющего способ открытия файла, приведены в табл. 15.10. Таблица 15.10. Способы открытия файла
|