|
дб. Четвертое издание джозеф Джарратано Университет Хьюстон клиэрЛэйк Гари Райли People5oft, Издательский дом "Вильямс" Москва СанктПетербург Киев 2007 ббк 32. 973. 26 018 75 Д
(float ?value2) ") ") (bind ?answer (read)) (while (or (not (numberp ? answer)) (< ?answer ?value1) (> ?answer ?value2))
824 Глава 10. Процедурное программирование (printout t ? question " (" (float ?valuel) (1оа]- ?value2) ") ") (bind ?answer (read))) (return ?answer)) CLIPS> (preview-generic check-input "Pick а number" 1 3)J check-input «2 (STRING) (INTEGER) (INTEGER) check-input №4 (STRING) (INTEGER FLOAT) (INTEGER FLOAT) check-input №3 (STRING) (NUMBER) (NUMBER) check-input №1 () $? CLIPS> Такое расположение методов по приоритетам стало результатом применения действий шага 4 ко второму параметру методов. Сравнение методов «3 и «4 показывает, что первое ограничение типа в методе №4, INTEGER, является более конкретным, чем первое ограничение типа в методе №3, NUMBER, поэтому метод имеет более высокий приоритет. А сравнение методов «2 и показывает, что первое ограничение типа в методе №2, INTEGER, является таким же, как и первое ограничение типа в методе № 4, поэтому переходим к анализу второго ограничения типа в каждом из методов. Поскольку метод №2 не имеет второго ограничения типа, а метод «4 имеет, то метод обладает более высоким приоритетом. Ограничения запроса В параметре метода допускается не только задавать ограничения типа, но и определять ограничение запроса. Ограничение запроса — это ссылка на конструкцию бейд1оЬа1 или вызов функции, выполнение которого позволяет определить применимость метода при вызове универсальной функции. Если обработка ограничения запроса приводит к получению символа, то данный метод является неприменимым. Ограничение запроса для параметра не вычисляется, если не удовлетворяются ограничения типа для этого параметра. Любой метод с несколькими параметрами может иметь несколько ограничений запроса, причем каждое из этих ограничений должно удовлетворяться, для того чтобы метод мог стать применимым. Рассмотрим пример, в котором может оказаться полезным ограничение запроса. Если будет вызвана универсальная функция check-input, ноне заданы дополнительные параметры, которые должны следовать за строкой вопроса, то функция будет действовать следующим образом CLIPS> (check-input "Pick а number")J Результаты вызова команды preview-generic показывают, что новый метод занял свое место между методами «2 и №3: 10.5. Конструкции de f generic и de fmethod 825 Pick а number () 3 Pick а number () 2 Pick а number () 5 Pick а number () О В данной ситуации применим метод №1, в котором используется параметр с подстановочным символом. Но за параметром со строкой вопроса, ? question, не заданы дополнительные параметры, поэтому параметр с подстановочным символом, $? связывается с многозначным значением, имеющим длину нуль. Проверка значения member$, применяемая в данном методе, всегда возвращает символ FALSE, поскольку в пустое многозначное значение невозможно включить ни одно значение, вводимое пользователем, поэтому из вызова данного метода таки не выполняется возврат. Эту проблему можно устранить, наложив на параметр с подстановочным символом ограничение запроса (defmethod check-input (?question ($?values (= (length$ ?values) 0))) (return FALSE)) CLIPS> Вызов команды preview — generic применительно к методу, в котором задан лишь параметр со строкой запроса, показывает, что при всех прочих одинаковых параметрах метод «2 получает более высокий приоритет, чем другой применимый метод, №5, благодаря наличию в нем ограничения запроса CLIPS> (preview-generic check-input "Pick а number")J check-input №5 () ($? ) В данном методе количество значений, хранящихся в параметре с подстановочным символом, $? values, определяется путем вызова функции length$, а возвращаемое значение с помощью функции = сравнивается с нулем. Это позволяет обеспечить применимость данного метода только к пустому многозначному значению. Обратите внимание на то, что параметры указанного метода (в данном случае ? value) можно использовать в рамках ограничения запроса. Все, что выполняет этот метод, сводится к тому, что он возвращает символ FALSE, поскольку пользователь не имеет возможности ввести допустимое значение. Но благодаря применению этого определения метода такой же вызов универсальной функции, как и перед этим, не приводит к созданию бесконечного цикла, как показано ниже. CLIPS> (check-input "Pick а number")J FALSE
826 Глава 10. Процедурное программирование check-input №1 () $? CLIPS> Рассмотрим еще одну ситуацию, в которой в универсальной функции check— input может возникнуть бесконечный цикла а number (3-1) 3 Pick а number (3-1) 2 Pick а number (3 — 1) 5 Pick а number (3-1) О (defmethod check-input ((?question STRING) (?value1 INTEGER) (?value2 INTEGER (< ?value2 ?value1))) (return FALSE)) Этот метод после обнаружения того, что пределы перепутаны местами, возвращает символ FALSE. Мы могли бы пройти на шаг дальше и просто переставлять значения в неправильно заданных диапазонах. Одним из способов решения этой задачи могло стать обычное дублирование кода, а также взаимная перестановка местами переменных в соответствующих местах (defmethod check-input ((?question STRING) (?value1 INTEGER) (?value2 INTEGER (< ?value2 ?
valuel))) (printout t ?question " (" ?value2 "-" ?value1 ") ") (bind ? answer (read)) (while (or (not (integerp ?answer)) (< ?answer ? value2) (> ?answer ?value1)) (printout t ?question " (" ?value2 В данном случае применимым является метод №2, в котором имеются один параметр со строкой вопроса и два целочисленных параметра. Но такого целого числа, которое было бы больше или равно 3 и меньше или равно 1, не существует, поэтому пользователь таки не сможет передать значение, которое соответствовало бы данной универсальной функции. Эту проблему можно устранить путем создания дополнительного метода с ограничением запроса, позволяющим определить то, что верхний предел меньше нижнего,
следующим образом. Конструкции defgeneric и defmethod 827 ?value1 ") ") (bind ? answer (read))) (return ?answer)) Этот подход осуществляется успешно, но приводит к дублированию большего объема кода, чем необходимо. Лучший способ состоит в том, чтобы снова вызвать универсальную функцию, нос параметрами, переставленными местами (defmethod check-input ((?question
STRING) (?value1 INTEGER) (?value2 INTEGER (< ?value2 ? value1))) (check-input ?question ?value2 ?value1)) Такая организация работы позволяет избежать возникновения бесконечного цикла из-за того, что параметры находятся в неправильном порядке, как показано ниже. CLIPS> (check-input "Pick а number" 3 1)J Pick а number ( 1-3 ) 3 3 CLIPS> Для того чтобы обеспечить полный охват всех возможных случаев, необходимо ввести дополнительный метод для осуществления еще одного метода, в котором используется тип NUMBER для задания диапазонов (defmethod check-input ((?question STRING) (?value1 NUMBER) (?value2 NUMBER (< ?value2 ?value1))) (check-input ?question ?value2 ?value1)) После этого вызов команды preview — generic с пределами диапазона, заданными в обратном порядке, показывает значительное увеличение количества применимых методов CLIPS> (preview-generic check- input "Pick а number" 3 1)J check-input №6 (STRING) (INTEGER) (INTEGER ) check-input ¹2 (STRING) (INTEGER) (INTEGER) check-input «4 (STRING) (INTEGER FLOAT) (INTEGER FLOAT) check-input №7 (STRING) (NUMBER) (NUMBER ) check-input №3 (STRING) (NUMBER) (NUMBER) check-input №1 () $? CLIPS> 828 Глава 10. Процедурное программирование Отслеживание работы универсальных функций и методов При отслеживании работы универсальных функций с помощью команды watch каждый раз, когда начинается или заканчивается выполнение универсальной функции, выводится информационное сообщение. А если с помощью команды watch отслеживается работа методов, то информационное сообщение отображается каждый раз, когда начинается или заканчивается выполнение метода. В качестве примера рассмотрим следующий вывода а number" 3 1) МТН » check-input:¹6 ED:1 (" Pick а number" 3 1) GNC » check-input ED:2 (" Pick а number" 1 3) МТН » check- input:¹2 ED:2 (" Pick а number" 1 3) Pick а number (1 — 3) 2 МТН
« check-input:¹2 ED:2 (" Pick а number" 1 3) GNC « check-input ED:2 (" Pick а number" 1 3) МТН « check-input:¹á ED:1 (" Pick а number" 3 1) GNC « check-input ED:1 (" Pick а number" 3 1) 2 CLIPS> Обозначение GNC вначале информационного сообщения показывает, что это сообщение относится к универсальной функции. Символ » показывает, что начинается вызов универсальной функции, а символ свидетельствует о том, что вызов универсальной функции закончен. Следующим символом является имя универсальной функции в данном случае рассматривается универсальная функция check — Символ ED является сокращением от "Evaluation Depth". За этим символом следует двоеточие, а затем показано значение текущей глубины вложенности вызовов в виде целого числа. Глубина вложенности вызовов показывает, как осуществляется вызов вложенных универсальных функций и конструкций def function. Отсчет этого значения начинается с нуля, а затем увеличивается на единицу после каждой передачи управления в очередную конструкцию de f function или в универсальную функцию. А после каждого выхода из конструкции de f function или из универсальной функции значение глубины вложенности уменьшается на единицу. Наконец, последний фрагмент отображаемой информации показывает фактические параметры вызова универсальной функции. Кроме того, информационные сообщения, относящиеся к методам, обозначенные вначале буквами МТН, содержат практически туже информацию, что и сообщения, относящиеся к универсальным функциям. Основная отличительная особенность сообщения последнего типа состоит в том, что в нем вслед за именем 10.5. Конструкции def generic и defmethod универсальной функции показан индекс метода. Индекс метода позволяет узнать, какой именно метод вызван на выполнение. В этом примере видно, что завершено выполнение двух методов. Вначале управление передается в метод 46, поскольку параметр с обозначением конца диапазона, равный 1, меньше, чем параметр с обозначением начала диапазона, равный 3. Затем снова вызывается универсальная функция check — input, нона этот раз с переставленными местами параметрами. Поскольку теперь параметры заданы в правильном порядке, вызывается на выполнение метод «2, пользователь вводит значение находящееся в допустимом диапазоне, и происходит возврат из обоих методов. Обычно гораздо удобнее отслеживать работу методов, а не универсальных функций, поскольку желательно знать, какой конкретный метод вызывается на выполнение, но предусмотрена возможность отслеживать работу и универсальных функций, и методов. Команды de fmethod Для манипулирования конструкциями de f me thod предусмотрено несколько команд. Для отображения текстового представления конструкции de f me thod используется команда сокращение от pretty print defmethod — структурированный вывод конструкции defmethod). Для удаления конструкции defmethod может служить команда undefmethod. Для отображения списка конструкций de fmethod, определенных в программе CLIPS, применяется команда Наконец, функция get-defmethod-list возвращает многозначное значение, содержащее список конструкций de fmethod. Эти команды имеют следующий синтаксис (ppdefmethod ) (undefmethod ) (list- defmethods []) (get-defmethod-list []) Команды ppdefmethod и undefmethod отличаются от команд, используемых для работы с другими конструкциями, тем, что в них, кроме имени конструкции de f необходимо указывать индекс. Кроме того, функции list — de fmethods и get — de fmethod — list не принимают необязательный параметр с именем модуля. Вместо этого необязательным параметром в них служит имя универсальной функции. Если это имя указано, то команда применяется только к методам этой универсальной функции вином случае она применяется ко всем методам всех универсальных функций. Ниже приведены примеры, в которых показано, как используются эти функции. CLIPS> (ppdefmethod check-input 5) J (defmethod MAIN::check-input
830 Глава 10. Процедурное программирование (?question ($? values (= (length$ ?values) 0))) (return FALSE)) CLIPS> (undefmethod check-input 4) 1 CLIPS> (list-defmethods)J check- input б (STRING) (INTEGER) (INTEGER ) check-input «2 (STRING) (INTEGER) (INTEGER) check-input «7 (STRING) (NUMBER) (NUMBER ) check-input №3 (STRING) (NUMBER) (NUMBER) check-input №5 () ($? ) check-input №1 () $? For а total of б methods CLIPS> (get-defmethod-list check-input)J (check- input б check-input 2 check-input 7 check-input 3 check-input 5 check-input 1) CLIPS> Обратите внимание на то, что методы, перечисленные в выводе команды list — de f methods, показаны в порядке приоритета. Кроме того, возвращаемое значение функции get — defmethod — list состоит из пар, которые включают имя универсальной функции и индекс метода. Команды de f generic В языке CLIPS предусмотрено несколько команд для манипулирования конструкциями бейдепегс. Для отображения текстового представления конструкции defgeneric используется команда ppdefgeneric (сокращение от pretty print defgeneric — структурированный вывод конструкции de f generic). Для удаления конструкции бейдепегс служит команда undefgeneric. Команда list-defgenerics применяется для отображения списка конструкций бейдепегс, определенных в программе CLIPS. А функция get-defgeneric-list возвращает многозначное значение, содержащее список конструкций бейдепегс. Эти команды имеют следующий синтаксис ) (undefgeneric ) (list-defgenerics []) (get-defgeneric-list []) Как показывает следующий диалог, команда unde f generic удаляет не только указанную конструкцию de f generic, но и все связанные с ней методы (list-defgenerics)J check-input For а total of 1 defgeneric.
10.5. Конструкции def generic и defmethod 831 CLIPS> (undefgeneric check-input)J CLIPS> (list-defgenerics)J CLIPS> (list- defmethods)J CLIPS> Перегруженные функции и команды Для конструкций def function и универсальных функций не могут совместно использоваться общие имена, но универсальные функции позволяют перегружать функции, определяемые пользователем. Предположим, например, что необходимо предусмотреть аналогичные операции для сложения типов данных, отличных от чисел. Вообще говоря, как показано ниже, в системе CLIPS это не допускается. CLIPS> (+ 3 4) J 7 CLIPS> (ген" "Ыие" ) 1 [ARGACCES5] Function + expected argument №1 to be of type integer or float CLIPS> (+ (create$ асе Попытка сложить две строки или два многозначных значения с использованием функции + приводит к возникновению ошибки. Но если требуется реализовать операцию сложения для строк как конкатенацию этих строки операцию сложения для многозначных значений как создание комбинации этих значений, то подобные функциональные средства можно создать, определяя методы, в которых для этой цели применяются функции str — cat их) уху+ (х) уху) После определения этих методов появляется возможность применять операции сложения данных указанных новых типов без возникновения ошибки CLIPS> (+ "red" "blue")J "redblue" CLIPS> (+ (create$ а Ь се (а b c d e f) Глава 10. Процедурное программирование 832 Для вывода на внешнее устройство информации о двух новых методах, которые были определены наряду с оригинальной функцией +заданной в языке CLIPS (обозначаемой индексом метода можно воспользоваться вызовом команды 1ist — de f methods: CLIPS> (list-defmethods +)J + «SYS1 (NUMBER) (NUMBER) ($?NUMBER) + «2 (LEXEME) (LEXEME) + №3 (MULTIFIELD) (MULTIFIELD) For а total of 3 methods. CLIPS> 10.6 Процедурные конструкции и конструкции de f module В модулях может осуществляться импорт и экспорт не только конструкций def template, но и на основе аналогичных принципов могут импортироваться и экспортироваться процедурные конструкции defglobal, def function и de f generic. Поэтому четыре из возможных операторов export и import, описанных в главе применительно к конструкциям de f template, распространяют свое действие и на процедурные конструкции (export А ) (export ?NONE) (import ?ALL) Обратите внимание на то, что система CLIPS способна при создании сигнатуры метода выявить типы параметров функции +определенной в системе. В данном случае можно видеть, что функция + принимает два или несколько числовых параметров. Если в программе требуется применить перегрузку функции, определяемой пользователем, то такую операцию следует выполнить, прежде чем применять какие-либо конструкции, которые ссылаются на эту функцию, определяемую пользователем. Это условие можно соблюсти, прежде чем делать ссылку на соответствующую функцию, либо явно задавая конструкцию defgeneric, либо задавая конструкцию de f generic неявно, путем определения конструкции de fmethod. В ссылках конструкций на определяемую пользователем функцию, сделанных до ее перегрузки, не будет использоваться механизм вызова перегруженного метода, поэтому всегда будет вызываться неперегруженная, определяемая пользователем функция. С другой стороны, в ссылках конструкций на определяемую пользователем функцию, сделанных после ее перегрузки, будет применяться механизм вызова перегруженного метода. Процедурные конструкции и конструкции defmodule 833 (import ?NONE) Оператор впервой форме позволяет экспортировать из модуля все экспортируемые конструкции оператор во второй форме показывает, что не экспортируется ни одна конструкция оператор в третьей форме импортирует все экспортированные конструкции из указанного модуля а оператор в четвертой форме не импортирует ни одну из конструкций, экспортированных из указанного модуля. Каждая из конструкций defglobal, def function и defgeneric имеет также связанные с ней операторы import и (или) export, которые позволяют указать, следует ли выполнять импорт и (или) экспорт всех, ни одной или указанного множества конструкций, как показано ниже. (export defglobal ?ALL) (export defglobal ?NONE) (export defglobal +) (export deffunction ?ALL) (export deffunction ?NONE) (export deffunction +) (export defgeneric ?ALL) (export defgeneric ?NONE) (export defgeneric +) (import defglobal ?ALL) (import defglobal ?NONE) (import defglobal +) (import deffunction ?ALL) (import deffunction ? NONE) (import deffunction +) (import defgeneric ?ALL) (import defgeneric ?NONE) (import defgeneric +) При осуществлении импорта и (или) экспорта конкретных конструкций сне f-- global ненужно задавать знаки вначале ив конце имени конструкции de f global. Например, следует указывать имя переменной water — freezing— point- Fahrenheit, а не *water-freezing-point-Fahrenheit*. Модуль, импортирующий конструкцию de f generic, импортирует также все ее методы. Возможность импортировать или экспортировать только конкретные методы отсутствует. Если в модуле не импортируется какая-либо конструкция de f global, def function или defgeneric из другого модуля, то остается возможность создать собственное определение такой конструкции с использованием того Глава 10. Процедурное программирование же имени. Применение ссылки на конструкцию, которая не была экспортирована и импортирована должным образом, приводит к возникновению ошибки, например, как показано ниже. CLIPS> (clear) J CLIPS> (defmodule MAIN (export deffunction function-1) (export defglobal global-1) (export defgeneric generic-1))J CLIPS> (deffunction MAIN: Юипс11оп-1 (х) (+ 1 ?x))J CLIPS> (deffunction MAIN: Гипса.оа-2 (?x) (+ 2 ?x))J CLIPS> (defglobal MAIN ?*global- 1* 1 ?*global-2* 2) 1 CLIPS> (defmodule EX3QCPLE (import MAIN deffunction ?ALL) (import MAIN defglobal global-1)) 1 CLIPS> (defglobal EXAMPLE ?*global-2* 3) 1 CLIPS> В модуле неявно импортируется конструкция de f global с именем global — 1 из модуля МАХИ с использованием ключевого слова ALL, а также явно импортируется конструкция de f function с именем function — 1 из модуля MAIN путем указания имени этой конструкции. С результатами выполнения операторов import и export можно ознакомиться, предприняв попытку получить доступ к каждой из этих конструкций в каждом модуле CLIPS> (get-current-module)J EXAMPLE CLIPS> (function-1 1) ! 2 CLIPS> (function-2 1)J [ЕХРКИРЯВЗ] Missing function declaration for function-2. CLIPS> ?*global-1*J 1 10.7. Полезные команды и функции 835 CLIPS> 7*global-2*J 3 CLIPS> (set-current-module MAIN)J EXAMPLE CLIPS> (function-1 1)J 2 CLIPS> (function-2 1)J 3 CLIPS> 7*global-1*J 1 CLIPS> 7*global-2*J 2 CLIPS> 10.7 Полезные команды и функции Загрузка и сохранение фактов visible local Функция load — facts загружает группу фактов, которые хранятся в файле, указанном параметром . Факты, заданные в файле, должны быть представлены в стандартном формате упорядоченных фактов или фактов, определяемых с помощью конструкции deftemplate. Например, если файл "facts . dat" содержит следующую информацию Быстродействие программы можно повысить, уменьшив количество фактов в списке фактов. Один из способов сокращения количества фактов состоит в том, чтобы факты загружались в систему CLIPS только тогда, когда они потребуются. Например, в программе, предназначенной для диагностирования неисправностей в автомобилях, можно вначале запросить информацию об изготовителе и модели автомобиля, а затем загрузить информацию, относящуюся к данному автомобилю. В языке CLIPS предусмотрены функции load- асЬ и save- facts, позволяющие загружать факты из файла и сохранять их в файле. Эти две функции имеют следующий синтаксис (load-facts ) (save-facts [ *]) В данном определении параметр — scope> имеет такую форму Глава 10. Процедурное программирование (data 34) (data 89) (data 64) (data 34) то такая команда загрузит все факты, содержащиеся в этом файле (load-facts "facts.dat") Команда system Команда system обеспечивает выполнение команд операционной системы из среды CLIPS. Команда system имеет следующий синтаксис (system +) Например, приведенное ниже правило позволяет получить листинг указанного каталога на компьютере, работающем под управлением операционной системы Unix. (defrule list-directory (list-directory ?directory) — > (system "ls " ?directory)) Для сохранения фактов из списка фактов в файле, указанном параметром , может использоваться функция save — facts. Факты сохраняются в таком же порядке, какой требуется для функции load — facts. Если параметр не задан или определен как local, тов файле сохраняются только факты, соответствующие конструкциям def template, которые определены в текущем модуле. Если же параметр scope> задан как visible, тов файле сохраняются все факты, соответствующие конструкциям de f template, которые являются видимыми в текущем модуле. Если используется параметр — scope>, то предоставляется возможность также задать одно или несколько имен конструкций de f template. В таком случае сохраняются только факты, соответствующие указанным конструкциям def template (но имена конструкций de f template так или иначе должны соответствовать спецификации local или visible). И функция load — facts, и функция save — facts
возвращают символ TRUE, если файл с фактами был успешно открыта затем загружен или сохранен в противном случае эти функции возвращают символ FALSE. Именно программист обязан обеспечить, чтобы конструкции соответствующие фактам, заданным с помощью конструкции deftemplate и хранящимся в файле фактов, были видимыми в текущем модуле, в котором выполняется команда load-facts. 10.7. Полезные команды и функции 837 Команда batch Команда batch позволяет считывать непосредственно из файла команды и ответы, которые в обычных условиях должны быть введены в приглашении верхнего уровня. Команда batch имеет следующий синтаксис (batch ) Например, предположим, что для прогона программы CLIPS необходимо провести следующий диалог, в котором показаны команды и ответы, предназначенные для ввода пользователем (напомним, что текст, обозначенный полужирным шрифтом, показывает, какие знаки пользователь должен вводить с клавиатуры CLIPS> (load "rules1.clp")J CLIPS> (load "rules2.clp")J CLIPS> (load "хи1е83.clp")J CLIPS> (reset)J CLIPS> (run)J How many iterations? 10 1 Starting value? 1 1 End value? 20 1 Completed CLIPS> Эти команды и ответы, необходимые для прогона программы, можно сохранить в файле, как показано ниже. В данном примере первым параметром команды system, "ls ", является команда предназначенная для получения списка файлов, записанных в каталоге. Обратите внимание на то, что за буквами 1 и s следует пробел. Дело в том, что команда system просто соединяет все свои параметры, заданные в виде строк, в одну строку, после чего предоставляет операционной системе возможность выполнить сформированную команду. Поэтому все пробелы, которые должны присутствовать в команде операционной системы, необходимо включить в состав параметров в вызове команды system. Результаты выполнения команды s ys tern могут зависеть от операционной системы. К тому жене все операционные системы предоставляют функциональные возможности для реализации команды system, поэтому не следует рассчитывать на то, что эта команда всегда будет доступна в языке CLIPS. Команда system не возвращает значение, поэтому невозможно непосредственно возвратить значение в систему CLIPS после выполнения команды операционной системы Предположим, что файл с командами и ответами получил имя "commands bat"; в таком случае следующий диалог показывает, как воспользоваться командой batch для его выполнения (еще раз отметим, что полужирным шрифтом отмечены знаки, которые должны быть введены с клавиатуры (batch "commands.ba1 ") 1 CLIPS> (load "rules1.clp")J CLIPS> (load "rules3.clp")J После считывания всех команд и ответов из пакетного файла режим работы с клавиатурой в приглашении верхнего уровня возвращается к нормальному. При эксплуатации исполняемой программы CLIPS в операционной системе, которая поддерживает возможность задания параметров командной строки для исполняемых файлов (такой как Unix), система CLIPS может автоматически выполнить команды из пакетного файла при запуске. Предположим, что исполняемый файл CLIPS может быть вызван путем ввода слова "clips"; в таком случае синтаксис команды операционной системы для вызова на выполнение пакетного файла при запуске системы CLIPS становится таковым clips -f Применение опции — f эквивалентно вводу команды (batch < f i le — name> ) непосредственно после запуска системы Вызовы команды batch могут быть вложенными. (load "rules1.clp")J (load "rules2.clp")J (load "rules3.clp")J (reset)J (run) 10J 1J 20J CLIPS> (reset)J CLIPS> (run)J How many iterations? 10 1 Starting value? 1J End value? 20J Completed CLIPS> Глава Процедурное программирование 10.7. Полезные команды и функции 839 Команды dribble-on и dribble-of f Для сохранения в протоколе всех результатов вывода на терминал и ввода с клавиатуры может служить команда dribble-on, которая имеет следующий синтаксис (dribble-on ) После вызова команды dribble — on на выполнение осуществляется эхо-повтор всех результатов вывода на терминал и ввода с клавиатуры не только на терминале, но ив файле, указанном с помощью параметра , если они заданы, должны представлять собой целочисленные значения и показывать диапазон целых чисел, которым ограничиваются возвращаемые случайные целые числа. Например, ниже приведена конструкция def function с именем roll — die, в которой используется функция random для моделирования броска шестигранной игральной кости путем выработки целочисленного значения от 1 доб б) Многократные вызовы конструкции de f f unction с именем roll — Же приводят к получению различных результатов CLIPS> (roll-die)J б CLIPS> (roll-die)J 1 CLIPS> (roll-die)J 4 CLIPS> (roll-die)J 1 CLIPS> Для задания начального значения генератора случайных чисел может использоваться функция seed, которая позволяет в дальнейшем воспроизвести прежнюю Глава 10. Процедурное программирование Преобразование строки в поле Для преобразования строкового значения поля в значение поля может использоваться функция синтаксис которой приведен ниже. (string-to-field ) В этом определении параметр подвергнуто синтаксическому анализу и преобразовано в поле, например, таким образом CLIPS> (string-to-field "7")J 7 CLIPS> (string-to-field " 3.4 2.1 3")J 3.4 CLIPS> В первом примере применения вызова функции string — to — field берется строковое поле "7" и преобразуется в целочисленное значение поля 7. Во втором примере вызова функции string-to — field показано, что в функцию переда- последовательность возвращаемых значений с использованием того же начального значения. Функция seed имеет следующий синтаксис (seed
|
|
|