Арифметическое выражение является числом или структурой. В структуру может входить одна или более компонент, таких, как числа, арифметические операторы, арифметические списковые выражения, переменная, конкретизированная арифметическим выражением, унарные функторы, функторы преобразования и арифметические функторы.
Арифметические операторы.
Язык Пролог не предназначен для программирования задач с большим количеством арифметических операций. Для этого используются процедурные языки программирования. Однако в любую Пролог-систему включаются все обычные арифметические операторы:
В некоторых реализациях языка Пролог присутствует более широкий набор встроенных арифметических операторов.
Арифметические списковые выражения. Если Х — арифметическое выражение, то список [X] также является арифметическим выражением, например [1,2,3]. Первый элемент списка используется как операнд в выражении. Скажем,
имеет значение 6.
Арифметические списковые выражения полезны и при обработке символов, поскольку последние могут рассматриваться как небольшие целые числа. Например, символ «а» эквивалентен [97] и, будучи использован в выражении, вычисляется как 97. Поэтому значение выражения «р»+»А»-«а» равно 80, что соответствует коду ASCII для «Р».
Три примера решения задачек на Прологе
Переменная, конкретизированная арифметическим выражением. Примеры:
Х = 5+2 и Y = 3 * (2+А)
Унарные функторы. Примеры:
Функторы преобразования. В некоторых реализациях Пролога имеется арифметика с плавающей точкой, а следовательно, и функторы преобразования. Например:
преобразует целое число Х в число с плавающей точкой.
Математические функторы. Пример:
квадрат(Х)эквивалентен арифметическому выражению (Х*Х).
Арифметические операторы.
Атомы +, -, *, /, mod и div — обычные атомы Пролога и могут использоваться почти в любом контексте. Указанные атомы — не встроенные предикаты, а функторы, имеющие силу только в пределах арифметических выражений. Они определены как инфиксные операторы. Эти атомы являются главными функторами в структуре, а сама структура может принимать только описанные выше формы.
Арифметический оператор выполняется следующим образом. Во-первых, вычисляются арифметические выражения по обе стороны оператора. Во-вторых, над результатом вычислений выполняется нужная операция.
Арифметические операторы определяются Пролог-системой. Если мы напишем предикат
среднее (X,Y,Z) :- Z is (X+Y)/2.
то, хотя можно определить среднее как оператор,
но Пролог выдаст сообщение об ошибке, если встретит выражение Z is X среднее Y.
Это произойдет потому, что Х среднее Y не образует арифметического выражения, а среднее не является арифметическим оператором, определенным в системе.
Вычисление арифметических выражений
В Прологе не допускаются присваивания вида Сумма=2+4.
Выражение такого типа вычисляется только с помощью системного предиката is, например:
Введение в программирование на языке Prolog. Решение варианта задачи.
Предикат is определен как инфиксный оператор. Его левый аргумент — или число, или неконкретизированная переменная, а правый аргумент — арифметическое выражение.
Попытка доказательства целевого утверждения Х is Y заканчивается успехом в одном из следующих случаев:
Х — неконкретизированная переменная, а результат вычисления выражения Y есть число;
Х — число, которое равно результату вычисления выражения Y. Цель Х is Y не имеет побочных эффектов и не может быть согласована вновь. Если Х не является неконкретизированной переменной или числом либо если Y — не арифметическое выражение, возникает ошибка.
D is 10- 5 заканчивается успехом и
D становится равным 5
4 is 2 * 4 — 4 заканчивается успехом
2 * 4 — 4 is 4 заканчивается неудачей
a is 3 + 3 заканчивается неудачей
X is 4 + а заканчивается неудачей
2 is 4 — X заканчивается неудачей
Обратите внимание, что предикат is требует, чтобы его первый аргумент был числом или неконкретизированной переменной. Поэтому М — 2 is 3 записано неверно. Предикат is не является встроенным решателем уравнений.
Предикаты ввода-вывода
Предикат readln считывает строку с текущего устройства ввода и связывает ее со своим единственным выходным параметром. Предикат readint читает с текущего устройства целое число и связывает его со своим единственным выходным параметром. Предикат readreal отличается от предиката readint тем, что он считывает не целое, а вещественное число.
Для чтения символа с текущего устройства ввода используется предикат readchar. Есть еще предикат inkey, который так же, как и readchar, читает символ со стандартного устройства ввода. Разница между ними в том, что предикат readchar приостанавливает работу программы до тех пор, пока не будет введен символ, а предикат inkey не прерывает выполнение программы.
Если нужно просто проверить, нажата ли клавиша, можно воспользоваться предикатом keypressed, не имеющим аргументов. Предикат readterm предназначен для чтения сложных термов. У него два параметра: первый входной указывает имя домена, второй параметр конкретизируется термом домена, записанного в первом параметре. Если считанная этим предикатом строка не соответствует домену, указанному в его первом параметре, предикат выдаст сообщение об ошибке.
Для записи данных в текущее устройство записи служит предикат write. Он может иметь произвольное количество параметров. Кроме того, в Турбо Прологе есть еще и предикат writef, который служит для форматного вывода данных. Для осуществления перехода на следующую строку (возврат каретки и перевод строки) применяется предикат nl, не имеющий параметров.
Описанная ниже группа предикатов служит для преобразования типов. Предикатupper_lower имеет два аргумента и три варианта использования. Если в качестве первого аргумента указана строка (или символ), а второй аргумент свободен, то второй аргумент будет означен строкой (символом), полученной из первого аргумента преобразованием к нижнему регистру.
Если в исходной строке были прописные английские буквы, то они будут заменены строчными. Если же, наоборот, первый аргумент свободен, а второй аргумент — это строка (или символ), то первый аргумент получит значение, равное строке (символу), полученной из второго аргумента преобразованием к верхнему регистру.
Если в строке, находящейся во втором аргументе, были строчные английские буквы, то они будут заменены прописными. И, наконец, имеется третий вариант использования. Если и первый, и второй аргументы связаны, то предикат будет истинным только в том случае, если во втором аргументе находится строка (символ), которая получается из строки, находящейся в первом аргументе, путем замены всех прописных английских букв на строчные. В противном случае предикат будет ложным.
Также имеют два параметра и три варианта использования предикаты str_int, str_real. Первый преобразует строку в целое число и наоборот. Второй служит для превращения строки в вещественное число или вещественного числа в строку. Предикат str_char имеет те же параметры использования и применяется для преобразования односимвольной строки в один символ и наоборот.
Немного по-другому работает предикат char_int. Он позволяет переходить от символа к его ASCII-коду и обратно.
Кроме того, можно использовать обычные математические функции, такие как: логарифмы натуральный (ln) и десятичный (log), квадратный корень (sqrt), модуль (abs), экспонента (exp). Тригонометрические функции: синус (sin), косинус (cos), тангенс (tan), арктангенс (arctan). Величины углов указываются в радианах.
Функция trunc отбрасывает дробную часть своего параметра, а функция round округляет вещественное число до ближайшего целого.
Для вычисления псевдослучайных чисел имеется два варианта предиката random. Первый вариант имеет один выходной параметр, в который помещается сгенерированное вещественное число, лежащее в промежутке межу нулем и единицей. Второй вариант этого предиката — двухаргументный. В качестве первого входного аргумента указывается целое число. Второй аргумент означивается целым числом, лежащим между нулем и первым аргументом.
Одноместный предикат free истинен, если его аргументом является свободная переменная, и ложен в противном случае. Предикат bound, наоборот, истинен, если его аргумент — это связанная переменная, и ложен, если его аргумент свободен.
Управление выполнением программы на прологе
Откат уже упоминался в предыдущих лекциях. Суть этого механизма такова: в том месте программы, где возможен выбор нескольких вариантов, Пролог сохраняет в специальный стек точку возврата для последующего возвращения в эту позицию. Точка возврата содержит информацию, необходимую для возобновления процедуры при откате. Выбирается один из возможных вариантов, после чего продолжается выполнение программы.
Во всех точках программы, где существуют альтернативы, в стек заносятся указатели. Если впоследствии окажется, что выбранный вариант не приводит к успеху, то осуществляется откат к последней из имеющихся в стеке точек программы, где был выбран один из альтернативных вариантов. Выбирается очередной вариант, программа продолжает свою работу. Если все варианты в точке уже были использованы, то регистрируется неудачное завершение и осуществляется переход на предыдущую точку возврата, если такая есть. При откате все связанные переменные, которые были означены после этой точки, опять освобождаются.
При объяснении сущности бэктрекинга часто приводят пример с поиском пути в лабиринте. Один из возможных способов найти выход из лабиринта — это на каждой развилке поворачивать в одну и ту же сторону, до тех пор, пока не попадешь в тупик. После попадания в тупик нужно вернуться до ближайшей развилки. На ней нужно выбрать другое направление.
После этого нужно опять на всех развилках выбирать поворот в том же направлении, что и в самом начале. Продолжаем этот алгоритм до тех пор, пока не выберемся из лабиринта.
Методы управления откатом:
Методотката после неудачи.
Этот метод используется в ситуации, когда нужно получить не один ответ, а все возможные в данной ситуации ответы. Например, если вопрос является внутренней целью, то Турбо Пролог останавливает поиск после первого же успешного вычисления цели. При этом выявляется только первое решение. В методе отката после неудачи обычно используется всегда ложный предикат fail.
Хотя, по большому счету, вместо этого предиката можно воспользоваться каким-нибудь заведомо ложным выражением. Например, 1=2 или чем-то в этом роде.
Пример. Теперь давайте напишем предикат, который будет выводить на экран с помощью стандартного предиката write имена всех дочек.
mother(_,Name), /* означивает переменную Name
именем дочки */
write(» «, Name), nl,
/* выводит значение переменной
Name на экран */
fail. /* вызывает откат на место, сохраненное
в стеке точек возврата */
write(«Имена дочек:»),nl,show_names.
Предикат fail вызывает неуспешное завершение правила, затем осуществляется откат в точку, помещенную в стек последней. Процесс повторяется до тех пор, пока не будут исчерпаны все варианты достижения подцели mother(_,Name). В окне диалога будут выведены имена всех дочек в том порядке, в котором они упоминались в программе.
пример с городами
Метод отсечения и отката.
В основе этого метода лежит использование комбинации предикатов fail (для имитации неудачи и искусственной организации отката) и «!» (отсечение или cut), который позволяет прервать этот процесс в случае выполнения какого-то условия. Предикат «!» всегда истинен и запрещает откат для подцелей, расположенных левее.
Пример. Модифицируем еще раз предикат, выводящий имена всех дочек, так чтобы он выводил их не все, а только до определенного имени. У предиката будет один входной аргумент, где указывается имя дочери, на котором должен оборваться вывод на экран имен дочек.
show_names3(Daughter):–mother(_,Name), /* означивает переменную Name именем дочки */write(» «, Name), nl, /* выводит значение переменной Name */Name=Daughter, /* проверяет совпадение имен дочек Name и Daughter. В случае несовпадения вызывает откат на место, указатель на которое хранится в стеке точек возврата. В случае совпадения, за счет наличия отсечения, завершает поиск и вывод имен дочек */write(«Искомый человек найден!»).
Метод повтора, определяемый пользователем.
Он также использует откат, однако, в отличие от метода отката после неудачи, в котором откат осуществляется только после специально созданной неудачи, в этом методе откат возможен всегда за счет использования специального предиката, обычно кодируемого в виде следующего предложения:
repeat.repeat:– repeat.
Этот предикат всегда успешен. После выполнения первого предложения процедуры в стек точек возврата запоминается указатель, поскольку имеется еще один альтернативный вариант для него. В теле второго предложения опять вызывается предикат repeat.
Предикат repeat не является встроенным предикатом, а имя «repeat» — зарезервированным словом. Соответственно, вместо этого имени можно использовать какое-нибудь другое. С помощью этого предиката можно организовывать циклы, подобные циклам в императивных языках программирования. Нужно не забыть добавить в правило, организующее цикл, кроме предиката repeat, условие завершения цикла и отсечение, чтобы не получилось зацикливания.
Пример. Создадим предикат, который будет дублировать символ, введенный пользователем с клавиатуры. Завершиться этот процесс должен, когда пользователь введет некий ключевой символ, о котором мы заранее договоримся, что его появление означает окончание процесса дублирования символов. Для определенности, возьмем в качестве такого символа точку (.).
double_char:– repeat, readchar(C), /* читаем символ с клавиатуры в переменную C */ write(C,C), nl,/* выводим на экран значение переменной C */ C=’.’. /* сравниваем значение переменной C с символом ‘.’*/ nl, write(«Была введена точка. Закончили.»).
Первой подцелью нашего правила записан вызов предиката repeat. Он обеспечивает нам повторное выполнение следующих за ним подцелей. Можно эксперимента ради закомментировать предикат repeat, дабы убедиться, что в этом случае цикла не получится. Последующие подцели выполнятся всего один раз.
Далее, используя стандартный предикат readchar, осуществляем чтение символа с клавиатуры в переменную C. Посредством встроенного предиката write выводим два экземпляра введенного пользователем символа на экран; стандартным предикатом nl переводим курсор на следующую строку. Затем значение переменной C сравнивается с символом точка (‘.’).
Это условие, которое, с одной стороны, обеспечивает откат на первую подцель (предикат repeat), а с другой обеспечивает выход из цикла. Если поступивший с клавиатуры символ отличен от точки, подцель C=’.’ терпит неуспех. Пролог-система осуществляет откат на последнее место, указатель на которое записан в стеке точек возврата.
Из подцелей, расположенных левее, альтернативы имелись только у первой подцели (предиката repeat). Все повторяется еще раз. Пользователь вводит символ, он дважды отображается на экране, сравнивается с точкой. Процесс повторяется до тех пор, пока введенный символ не окажется точкой. В этом случае подцель C=’.’ окажется успешной, управление перейдет на подцели, расположенные правее.
Предикат nl сдвинет курсор на начало следующей строки, стандартный предикат write выводит на экран сообщение: «Была введена точка. Закончили.» — и процесс дублирования символов на этом завершается.
Напишем внутреннюю цель, которая проинформирует пользователя о правилах работы нашей программы, после чего запустит предикат double_char.
Источник: megapredmet.ru
Презентация на тему Логическое программирование
Слайд 1
Логическое программирование
Слайд 2 Содержание
История и основатели языка
Ключевые особенности
Диалект SWI-Prolog
Слайд 3 Язык Пролог
PROLOG ~ “PROgramming in LOgic” (“Программирование в
терминах логики”) – самый популярный язык логического прогр.
Язык
основан на теории исчисления предикатов первого порядка и методах доказательства
теорем.
Основной метод вычислений – резолюция (“resolution”, процедура доказательства)
Поддерживает декларативный (описательный) стиль программирования – программы конструируются в терминах точного определения проблемной ситуации / формулировки задачи, без написания программы в виде последовательности инструкций по выполнению алгоритма («что истинно», а не «как решить задачу»)
Программа на Прологе определяет, является ли заданная цель истинной/достижимой, и если да – то при каких условиях / значениях переменных («что получить»). Процедурность Пролога выражается в опеределении порядка действий по достижению цели («как получить»).
Слайд 4 История Пролога (основы)
1965 , «A machine oriented logic
based on the resolution principle», «Journal of the ACM
№12″, Дж. Робинсон представил метод автоматического поиска доказательства теорем в
исчислении предикатов первого порядка — «принцип резолюции».
работа Роберта Ковальского «Логика предикатов как язык программирования», 1974: заложила теоретические основы.
В 1973 году «группа искусственного интеллекта» во главе с Аланом Кольмероэ создала в Марсельском университете программу, предназначенную для доказательства теорем.; программа использовалась при построении систем обработки текстов на естественном языке; получила название Prolog (от Programmation en Logique); прообраз Пролога (1я эксперим. реализация)
Слайд 5 История Пролога (реализации)
Первая программа на Прологе была написана
в начале 1970 годов во Франции, в рамках проекта
по пониманию естественного языка.
Маартен ван Эмден из Эдинбурга (экспериментальная демонстрационная
система); совместно в 1976 г. предложили два подхода к прочтению текстов логических программ: процедурный и декларативный.
В 1977 году в университете Эдинбурга, каф. ИИ, Дэвид Уоррен и Фернандо Парейра создали очень эффективный компилятор языка для ЭВМ DEC–10 («эдинбургская версия») — прототип для многих последующих реализаций Пролога; был сам написан на Прологе.
В 1980 году Кларк и Маккейб в Великобритании разработали версию Пролога для персональных ЭВМ.
В 1981 году стартовал проект Института по разработке методов создания компьютеров нового (пятого) поколения.
в 1996 году был опубликован официальный стандарт ISO языка Prolog.
Слайд 6 Ключевые особенности
Усилия программиста должны быть направлены на описание
логической модели фрагмента предметной области решаемой задачи в терминах
объектов предметной области, их свойств и отношений между собой, а
не деталей программной реализации.
Пролог — язык для описания данных и логики их обработки.
Программа на Прологе не является таковой в классическом понимании, поскольку не содержит явных управляющих конструкций типа условных операторов, операторов цикла и т. д., а представляет собой модель фрагмента предметной области, о котором идет речь в задаче.
Решение задачи записывается не в терминах компьютера, а в терминах предметной области решаемой задачи, в духе модного сейчас объектно-ориентированного программирования.
Пролог очень хорошо подходит для описания взаимоотношений между объектами. Поэтому Пролог называют реляционным языком.
Слайд 7 Достоинства Пролога
Часто используется для создания систем управления базами
данных, где применяются очень сложные запросы, которые довольно легко
записать на Прологе.
В Прологе очень компактно, по сравнению с императивными
языками, описываются многие алгоритмы;
Пролог-программу, как правило, очень легко писать, понимать и отлаживать.
Прологу присущ ряд механизмов, которыми не обладают традиционные языки программирования: сопоставление с образцом, вывод с поиском и возвратом.
Для хранения данных в Прологе используются списки, а не массивы. В языке отсутствуют операторы присваивания и безусловного перехода, указатели. Естественным и зачастую единственным методом программирования является рекурсия.
Слайд 8 Основные области применения Пролога
быстрая разработка прототипов прикладных, автогенерация
кода;
верификация программ и разработка высокоуровневых ЯП;
системы автоматического программирования;
естественно-языковые
интерфейсы для существующих систем;
символьные вычисления: решение уравнений, диффернц./интегрир.;
автоматическое доказательство теорем;
проектирование
динамических реляционных БД и СУБД;
экспертные системы и оболочки экспертных систем;
автоматический перевод с одного языка на другой;
системы автоматизированного проектирования;
и многие другие области … (в т.ч. связанные с ИИ)
Слайд 9 Ключевые особенности
Области, для которых Пролог не предназначен:
большой
объем арифметических вычислений (обработка аудио, видео и т.д.);
написание
драйверов.
К достоинствам языка относятся:
сочетание декларативного и процедурного подхода;
простые и легко
понимаемые тексты программ;
высокая степень модульности, обеспечивающая модификацию и отладку программ;
эффективность реализации интерпретатора (транслятора) на всех типах ЭВМ.
Слайд 10 Диалекты Пролога
На сегодня существует довольно много реализаций Пролога.
Наиболее известные из них следующие:
Turbo Prolog,
SWI Prolog,
Micro Prolog,
AMZI-Prolog,
Arity Prolog,
CProlog,
Quintus Prolog,
Strawberry Prolog,
UNSW Prolog и т. д. …
В России были разработаны такие версии Пролога как:
Пролог-Д (Сергей Григорьев),
Акторный Пролог (Алексей Морозов),
Флэнг (Александр Манцивода, Вячеслав Петухин).
Слайд 11 SWI Prolog
мощная среда разработки с набором графических инструментов
ХРСЕ, распространяемая на условиях лицензии GNU GPL.
развитие началось
в 1987 г., и сегодня он широко используется в исследованиях,
образовании, а также в коммерческих приложениях.
довольно популярная система, в основном благодаря удобной среде и переносимой библиотеке для создания графического интерфейса.
почти как все реализации в основном следует знаменитому «эталону» — Edinburgh Prolog, но содержит частично реализованные особенности ISO Prolog.
содержит быстрый компилятор, профилировщик, набор библиотек и удобный интерфейс для подключения Си-модулей.
реализован для ряда UNIX-платформ таких как HP, IBM Linux, для NeXT, OS/2, Sun и Sparc, а также для традиционного семейства ОС Windows.
Слайд 12 Выводы
Язык Пролог является классическим языком парадигмы логического программирования;
основан на декларативном стиле.
Автор Пролога – Алан Кольмероэ из
Марсельского университета, разработавший 1ю версию языка в 1973 году.
Пролог используется
во многих областях, связанных с искусственным интеллектом.
Существует множество разновидностей (диалектов) Пролога, одна из самых эффективных – версия SWI Prolog, изучению которой будет уделено время на практике.
Источник: mypreza.com
Методические указания для студентов «Работа в Прологе»
Учебно-методическое пособие предназначено для студентов, обучающихся по специальности «Информационные системы (по отраслям)», а также может использоваться всеми, кто интересуется вопросами логического программирования.
Картинками
Министерство сельского хозяйства Российской Федерации
Адамовский сельскохозяйственный техникум – филиал
Федерального государственного бюджетного образовательного учреждения
«Оренбургский государственный аграрный университет»
Практикум решения задач
по курсу «Интеллектуальные информационные системы»
учебно-методическое пособие
для студентов, обучающихся по специальности «Информационные системы (по отраслям)»
Рецензент: Председатель информационных и естественно-математических дисциплин, преподаватель спецдисциплин Адамовского сельскохозяйственного техникума – филиала ФГБОУ ВО ОГАУ Киселева С.В.
Гайфуллина Т.Ф. Практикум решения задач по курсу «Интеллектуальные информационные системы». Учебно-методическое пособие для студентов, обучающихся по специальности «Информационные системы (по отраслям)». – Адамовка , 2017г.
Рассматриваются типовые задачи и контрольные задания по курсу «Интеллектуальные информационные системы». Пособие может быть использовано при организации самостоятельной работы студентов по выполнению заданий в среде Visual Prolog
Учебно-методическое пособие предназначено для студентов, обучающихся по специальности «Информационные системы (по отраслям)», а также может использоваться всеми, кто интересуется вопросами логического программирования.
1.1. Cреда Visual Prolog: основные понятия, интерфейс……….5
1.2 Набор, редактирование и тестирование простейших
программ в режиме Test Goal …………………………………….7
1.3 Создание простейших проектов…………………………….13
1.4 Поиск с возвратом……………………………………………17
1.5 Управление поиском с возвратом: предикаты fail и отсечения ………………………………………………………. 20
1.6 Арифметические вычисления……………………………….25
1.8 Решение логических задач в ПРОЛОГе…………………….32
2. Разработка графического интерфейса пользователя …. 41
2.1 Создание простейших проектов с графическим интерфейсом…………………………………………………. 41
2.2 Создание новых окон в проекте с использованием
кнопок и полей ввода…………………………………………….45
2.3 Использование элемента List B ox…………………………..51
3. Создание экспертных систем средствами ПРОЛОГа …. 54
Предлагаемое методическое пособие представляет собой описание лабораторных работ по курсу «Интеллектуальные информационные системы» и предназначено для студентов, обучающихся по специальности «Информационные системы (по отраслям)».
Основная цель пособия – помощь студентам в подготовке к выполнению лабораторных работ.
Целью выполнения данных лабораторных работ является приобретение студентами навыков работы в среде Visual Prolog (формальная постановка задачи, преобразование в форму, пригодную для программирования на Прологе, трассировка и оценка результатов) а также закрепление теоретических знаний, полученных при прослушивании курса лекций «Интеллектуальные информационные системы».
Пособие содержит необходимый теоретический материал, примеры решения задач и задания по программированию на языке Пролог.
К каждому разделу приводятся несколько типовых задач с решениями, что позволяет студентам самостоятельно подготовиться к выполнению лабораторной работы.
В качестве результата выполнения лабораторной работы студентом должен быть подготовлен отчет о проделанной работе, который включает:
1. Постановку задачи
2. Входные/Выходные данные (при необходимости)
3. Текст программы на языке Пролог (с необходимыми комментариями)
4. Трассировку программы
5. Результаты тестирования (наборы входных и выходных данных).
В настоящем пособии приводится список литературы, которая может быть использована при подготовке к лабораторным работам.
1. Основы ПРОЛОГа
1.1. C реда Visual Prolog : основные понятия, интерфейс.
Prolog является языком, основанным на программировании логики (PROgramming in LOGic). Вместо детальных инструкций, предписывающих как решать ту или иную задачу, программист на языке Prolog уделяет основное внимание описанию задачи.
В среде Visual Prolog используется подход, получивший название «визуальное программирование», при котором внешний вид и поведение программ определяются с помощью специальных графических средств проектирования без традиционного программирования на алгоритмическом языке.
Visual Prolog автоматизирует построение сложных процедур и освобождает программиста от выполнения тривиальных операций. С помощью Visual Prolog проектирование пользовательского интерфейса и связанных- с ним окон, диалогов, меню, линии уведомлений о состояниях и т.д. производится в графической среде. С созданными объектами сразу же могут работать различные Кодовые Эксперты (Code Experts), которые используются для генерации базового и расширенного кодов на языке Prolog, необходимых для обеспечения их функционирования.
В Visual Prolog входят интерактивная среда визуальной разработки (VDE — Visual Develop Environment), которая включает текстовый и различные графические редакторы, инструментальные средства генерации кода, конструирующие управляющую логику (Experts), а также являющийся расширением языка интерфейс визуального программирования (VPI — Visual Programming Interface), Пролог-компилятор, набор различных подключаемых файлов и библиотек, редактор связей, файлы, содержащие примеры и помощь.
Visual Prolog поддерживается различными ОС, в том числе MS-DOS PharLap-Extended DOS, всеми версиями Windows, 16- и 32-битовыми целевыми платформами OS/2, а также некоторыми другими системами, требующими графического пользовательского интерфейса.
В зависимости от выбранного интерфейса разработчику обеспечивается доступ к множеству генераторов кода (Code Expert), всевозможным ресурсным редакторам и особым дополнительным VPI-предикатам, определениям и библиотекам. Ресурсные редакторы применяются для создания, компоновки и редактирования окон, диалогов, меню, панелей инструментов, строк помощи, строковых таблиц, ярлыков, курсоров, битовых карт и оперативной помощи. Генераторы кода на основе подобных структур создают необходимый первичный Prolog-код. В результате появляется первичный код («скелет»), готовый для компиляции, редактирования связей и выполнения.
Интерфейс Visual Prolog включает: главное меню, панель инструментов, окно проекта. Если во время последнего использования системы Visual Prolog там был открытый проект, то система автоматически вновь откроет этот проект.
На рис.1 изображен внешний вид среды Visual Prolog после запуска. В окне проекта отображаются модули открытого проекта route.prj: karta.pro, route.pro, VPITools.pro.
кнопки для работы с компонентами проекта
рис.1. Среда разработки Visual Prolog 6.1
Левая панель кнопок в окне проекта позволяет выбирать нужный компонент проекта: модуль, окно, меню и т.д. С помощью кнопок правой панели выбранный компонент можно редактировать(кнопка Edit ), удалять(кнопка Delete ), а также добавлять новый(кнопка New ).
Пункт меню File содержит команды для работы с файлами. Чтобы создавать новое окно редактирования, можно использовать команду File | New. Эта команда создаст новое окно редактора с заголовком «NONAME».
В меню Edit представлены команды, позволяющие редактировать текст программы. Встроенный редактор системы по интерфейсу похож на обычный текстовый редактор. Можно производить вырезку, копирование и вставку текста, операции Отмена/Восстановление, которые можно активизировать из меню Edit. Также меню Edit показывает «горячие клавиши», связанные для этих действий.
Пункт меню Project содержит команды для работы с проектом: создать новый, открыть, запустить и т.д. Запуск проекта на исполнение выполняется нажатием кнопки < R >на панели инструментов (или F 9, или с помощью команд меню Project | Run ).
Команды меню Options позволяют выполнять настройку проекта, устанавливать необходимые параметры.
ЗАДАНИЯ ДЛЯ САМОСТОЯТЕЛЬНОЙ РАБОТЫ
Запустите среду Visual Prolog . Откройте проект, указанный преподавателем. Запустите его на исполнение и проверьте его работу.
1.2 Набор, редактирование и тестирование простейших программ в режиме Test Goal
Программа на ПРОЛОГе состоит из предложений, которые могут быть фактами, правилами или запросами. Как правило, программа состоит из четырех разделов.
DOMAINS – секция описания доменов(типов). Секция применяется, если в программе используются нестандартные домены.
PREDICATES – секция описания предикатов. Секция применяется, если в программе используются нестандартные предикаты.
CLAUSES – секция предложений. Именно в этой секции записываются предложения: факты и правила вывода.
GOAL – секция цели. В этой секции записывается запрос.
Среда Visual Prolog позволяет протестировать программу без создания проекта. Для этого используется утилита Test Goal . Достаточно создать новый файл, набрать текст программы и активизировать Test Goal нажатием кнопки < G >на панели инструментов. Автономно исполняемый файл при этом не создается. Утилита Test Goal компилирует только тот код, который определен в активном окне редактора (код в других открытых окнах или модулях проектов, если они есть, игнорируются). Test Goal находит все возможные решения задачи и автоматически выводит значения всех переменных.
Имеется база данных, содержащая следующие факты:
1) верно ли, что Марина является родителем Саши;
2) верно ли, что Алексей является родителем Ольги;
3) кто является ребенком Николая;
4) кто родители Ивана;
5) всех родителей и их детей.
1. Запустите среду Visual Prolog. Закройте окно проекта (если оно открыто) и откройте новый файл (File|New) (рис.2)
В появившемся окне наберите текст программы, содержащий разделы: PREDICATES (описание предиката родитель), CLAUSES (перечисляются имеющиеся факты) и GOAL (запрос).
рис.2. Рабочее окно редактора
nondeterm родитель ( имя , имя )
Запустите и протестируйте программу с помощью команды Project | Test Goal (можно использовать кнопку на панели инструментов или сочетание клавиш + ). Результат выполнения программы будет выведен в отдельном окне
рис3. Окно вывода результата
Указание : перед следующим запуском программы следует закрыть это окно.
2. Для ответа на вопрос: верно ли, что Алексей является родителем Ольги, измените запрос:
После запуска программы (Project | Test Goal) будет получен ответ: no
3. Для ответа на вопрос: кто является ребенком Николая, запишите цель:
4. Для ответа на вопрос: кто родители Ивана, укажите запрос:
родитель(X, иван), родитель(Y, иван), X<>Y.
5. Для определения всех родителей и их детей, запишите:
Источник: znanio.ru