русс | укр

Языки программирования

ПаскальСиАссемблерJavaMatlabPhpHtmlJavaScriptCSSC#DelphiТурбо Пролог

Компьютерные сетиСистемное программное обеспечениеИнформационные технологииПрограммирование

Все о программировании


Linux Unix Алгоритмические языки Аналоговые и гибридные вычислительные устройства Архитектура микроконтроллеров Введение в разработку распределенных информационных систем Введение в численные методы Дискретная математика Информационное обслуживание пользователей Информация и моделирование в управлении производством Компьютерная графика Математическое и компьютерное моделирование Моделирование Нейрокомпьютеры Проектирование программ диагностики компьютерных систем и сетей Проектирование системных программ Системы счисления Теория статистики Теория оптимизации Уроки AutoCAD 3D Уроки базы данных Access Уроки Orcad Цифровые автоматы Шпаргалки по компьютеру Шпаргалки по программированию Экспертные системы Элементы теории информации

Интерфейс пользователя


Дата добавления: 2014-11-28; просмотров: 886; Нарушение авторских прав


После запуска системы на экране монитора высвечивается ее главное меню, которое выглядит так:

 

 

Рис. 1

 

Рассмотрим сначала расположение окон. Слева вверху расположено окно редактора, в котором размещается тестируемая или выполняемая программа (без вопроса). Она может быть загружена из файла или составлена с помощью встроенного редактора. В окне сообщений (“Message”) помещается информация о действиях, выполненных системой, например, загрузка базы знаний из файла (как на рис. 1), компиляция, выполнение программы, диагностика ошибок и пр. Диалоговое окно (“Dialog”) используется для помещения вопросов и результатов выполнения программы. Наконец, в окне трассировки (“Trace”) при использовании специальной директивы помещается трассировка, т.е. информация о результатах каждого шага выполнения программы. При необходимости редактирования больших программ окно базы знаний может быть расширено за счет других окон с помощью функциональной клавиши F5 и тогда главное меню примет вид:

 

 

Рис 2

 

Повторное нажатие клавиши F5 вернет меню у первоначальному виду. Аналогично можно расширить и диалоговое окно.

Строка меню вверху включает обычные для программных систем средства: загрузку, и сохранение баз знаний, вызов редактора, компиляцию и выполнение программ, некоторые опции главного меню, изменение размеров окон и т.д.

 

3.2. Структура программна Турбо-Прологе

 

В противоположность стандартному Прологу, в котором программа – это совокупность базы знаний и вопроса, в Турбо-Прологе под программой естественнее понимать базу знаний и сопутствующую информацию, а вопросы рассматривать как начальные данные, необходимые для запуска программы на выполнение. Программа на Турбо-Прологе состоит из пяти разделов: раздела описания доменов, раздела базы данных, раздела описания предикатов, раздела внутренней цели и раздела базы знаний. Некоторые из этих разделов: описания доменов, базы данных, внутренней цели могут быть опущены. Кроме того, в любом месте программы можно помещать комментарий, который обрамляется символами /* и */. В настоящей книге мы не будем рассматривать программы, которые содержат внутреннюю цель, и поэтому опустим соответствующий раздел. С учетом этого замечания структура программы может быть представлена следующим образом:



го условия нет). Это ограничение введено с целью оптимизировать работу со списками. Кроме того, не применяется представление списков в виде соединений.

 

Раздел Database – описание динамической базы данных

Будет рассмотрен ниже.

РазделPredicates – описание предикатов

В этом раздел е должны быть перечислены все предикаты, используемые в базе знаний данной программы за исключением встроенных. Для каждого предиката указывается его имя и в скобках через запятую имена типов констант, представляющих термы предиката (если они имеются). Приведем описание некоторых предикатов, рассмотренных в пп. 2.3 – 2.5:

предок(string, string), diff(formula, symbol, formula), belong(char, list), conc(list, list, list).

В разделе Domains должны быть описаны типы констант formula и list.

 

Раздел Clauses – база знаний

 

/* */ /* комментарий */ /* */   Domains   <описание нестандартных типов констант>   Database   <описание динамической базы данных>   Predicates   <описание предикатов>   Clauses   <база знаний>   /* */ /* комментарий */ /* */

 

Рис. 3

 

Вопросы, которые в Турбо-Прологе называются внешними целями, вводятся пользователями в окно “Goal” главного меню и будут рассмотрены ниже. Пока отметим, что компиляция программы (вернее той ее части, которая представлена на рис. 3) выполняется до задания вопроса и, таким образом, при последовательном задании нескольких вопросов перекомпиляция не требуется.

Как видно из приведенной структуры, программа на Турбо-Прологе отличается от программы на стандартном Прологе, поскольку имеет разделы, отсутствующие в стандарте. Рассмотрим подробнее назначение разделов и информацию, которая должна в них находиться.

 

Раздел Domains – описание нестандартных типов констант

Напомним, что константы (в том числе и структуры) представляют объекты предметной области, моделируемой базой знаний. Типы констант определяют множества объектов, сгруппированных в соответствии с их синтаксическими и семантическими характеристиками. Такими типами являются, например, целые и вещественные числа, символы, строки и т.д. Типы констант Турбо-Пролога делятся на два класса: стандартные, т.е. встроенные в систему и потому не требующие специального описания, и нестандартные, которые должны быть описаны. Множество констант некоторого типа называется доменом этого типа. Каждый тип констант должен иметь уникальное имя. Стандартные типы Турбо-Пролога представлены в следующей таблице.

 

тип констант Имя домен Примеры
Символы Char любые символы ′a′, ′A′, ′1′, ′&′, ′\13′
целые числа Integer в диапазоне от -32768 до 32767 325, -1450, -1, +56, 32766
вещественные числа Real по модулю в диапазоне от 1E-307 до 1E306 3425, -24, 124.31, 12.1E-2, 0.234E10, 14.23E+3
Строки String последовательность любых символов в кавычках ²John², ²Андрей Сидоров², ²12.234², ²(a+b)*c²
символические имена Symbol Строки либо последовательность букв, цифр и знаков подчеркивания, начинающаяся со строчной буквы ²John², ²12.234², pattern, day_1, pay_check_125
Файлы File Имя файла new.txt, matrix.doc, A.dba

 

Нестандартные типы констант, которые используются в программе, должны быть описаны в разделе “Domains”. Каждый нестандартный тип определяется через стандартные или другие описанные в данной программе нестандартные типы. Пусть, например, нам требуется ввести типы “owner”, и “thing”. В первый из них включим владельцев некоторым имуществом, а во второй – имущество (вещи), принадлежащие владельцам. Если и те и другие представлены в базе знаний строками, то в разделе “Domains” они могут быть описаны так:

Owner = string thing = string-   или owner = string thing = owner или owner, thing = string

 

Важно понимать, что хотя константы обоих типов представлены строками, их домены не только не совпадают, но, исходя из смысла, даже не пересекаются. Если, например, база знаний содержит двухместный предикат «владеть» (“own”), то естественно считать, что его первый терм означает владельца, а второй – вещь, которой он владеет. Утверждение «Иван имеет машину» может быть представлен фактом own(“Иван”, “машина”), откуда следует, что константа “Иван” входит в домен owner, а константа “машина” – в thing.

Структуры также описываются в разделе Domains. Например, структура, представляющая книги библиотеки (см. п. 2.1), может быть описана следующим образом:

library = book(author, title, publisher, year)

author, title, publisher = string

year = integer

Особый метод используется для описания списков. Если элементы списка входят в домен типу констант type, то список представляется в виде type*. Пусть, например, необходимо описать список сотрудников некоторого учреждения, причем сотрудники представлены своими именами в виде строк. Описание может выглядеть так:

employee = string

list_of_employee = employee*

При этом данные строки можно поменять местами.

Заметим, что в Турбо-Прологе понятие списка уже, чем в стандартном языке. В Турбо-Прологе требуется, чтобы элементы списка являлись константами одного и того же типа (в стандарте этого условия нет). Это ограничение введено с целью оптимизировать работу со списками. Кроме того, не применяется представление списков в виде соединений.

 

Раздел Database – описание динамической базы данных

В данном курсе не рассматривается.

РазделPredicates – описание предикатов

В этом разделе должны быть перечислены все предикаты, используемые в базе знаний данной программы за исключением встроенных. Для каждого предиката указывается его имя и в скобках через запятую имена типов констант, представляющих термы предиката (если они имеются). Приведем описание некоторых предикатов, рассмотренных в пп. 2.3 – 2.5:

предок(string, string), diff(formula, symbol, formula), belong(char, list), conc(list, list, list).

В разделе Domains должны быть описаны типы констант formula и list.

 

Раздел Clauses – база знаний

Этот раздел формируется из фактов и правил базы знаний. Предложения базы знаний представляются практически так же, как и в стандартном Прологе.

 

 

Вопросы

Как уже упоминалось, вопросы пользователей размещаются в окне Dialog. После запуска программы на выполнение (путем щелчка по кнопке Run в строке меню) в окне Dialog появляется слово Goal с двоеточием и мерцающим курсором. Это свидетельствует о готовности системы выполнить программу, для чего в окно Dialog нужно ввести вопрос. После ввода запуск программы производится нажатием клавиши Enter.

Результаты выполнения программы также размещаются в окне Dialog, после чего система приглашает пользователя ввести следующий вопрос. На рис. 3 показано главное меню после обработки двух вопросов пользователя.

 

 

Рис. 3

 

Заметим, что в окно Dialog могут помещаться данные, выводимые встроенным предикатом “write”.

 

Первые примеры

Рассмотрим простые примеры программ на Турбо-Прологе, причем первые три из них (3.3.1 – 3.3.3) являются модификациями примеров, рассмотренных в пп. 2.2 – 2.4.

 

3.3.1. Родственные отношения

 

На рис. 3 представлен упрощенный вариант программы, аналогичной программе из пп. 2.2 – 2.3 «Родственные отношения». В ней используются два предиката: parent (родитель), задающий отношение «родитель → сын или дочь» и ancestor (предок), задающий отношение «предок → потомок». Комментарии к этому примеру не требуются.

 

3.3.2. Библиотечные каталоги.

Ниже представлена модифицированная программа из примера (1) п. 2.4:

 

/* Программа "Библиотечные каталоги"

Назначение: демонстрация использования

функтора */

 

domains

personal_library = book(title,author,publisher,

year)

collector,title,author,publisher=symbol

year=integer

 

predicates

collection(collector,personal_library)

 

clauses

collection("Анисимова",

book("Программирование на языке Пролог",

"Клоксин У., Меллиш К.",

"Мир",1987)).

collection("Анисимова",

book("Логика в решении проблем",

"Ковальски Р.",

"Наука",1990)).collection("Братчиков",

book("Синтаксис языков программирования",

"Братчиков И.Л.",

"Наука",1975)).

collection("Анисимова",

book("Язык программирования Пролог",

"Стобо Дж.",

"Радио и связь",1993)).

collection("Анисимова",

book("Системы продукций",

"Яхно Т.М.",

"АН СССР. Сиб. отделение",1990)).

collection("Братчиков",

book("Введение в МПролог",

"Иванова Г.С., Тихонов Ю.В.",

"МГТУ",1990)).

collection("Братчиков",

book("Принципы искусственного интеллекта",

"Нильсон Н.",

"Радио и связь",1985)).

collection("Братчиков",

book("Реализация экспертных систем",

"Клещев А.С.",

"Препринт ДВО АН СССР",1988)).

collection("Братчиков",

book("Компиляторы",

"Ахо А., Сети Р., Ульман Дж. ",

"Вильямс", 2003)).

 

Отметим способ описания домена personal_library. Домен описан с помощью функтора book. После него описаны домены, представляющие компоненты функтора. На рис. 5 представлено расширенное диалоговое окно с вопросом и тремя вариантами решения.

Рис. 4

3.3.3. Целые числа в заданном интервале.

Модифицированная программа из примера (2), п. 2.4представлена на рис. 4.

 

 

 

Рис. 5

 

В главном меню, показанном на рис. 5, расширено окно редактора – для того, чтобы в нем поместилась вся программа. В окне Dialog содержатся тексты, выведенные встроенным предикатом write, и введенные пользователем нижняя и верхняя границы интервала.

 

3.3.4. Простые числа

Усложним условие предыдущего примера: пусть необходимо вывести простые числа, находящиеся в заданном интервале. Программа, решающая данную задачу, может быть построена на основе предыдущей программы, в которую нужно включить проверку того, является ли очередное число из интервала простым. Соответствующий фрагмент программы содержит два предиката: prime_numberи del. Анализ числа заключается в проверке отсутствия у него делителей и выводе его при положительном результате этой проверки. Если в заданном интервале нет простых чисел, вместо них выводится сообщение «Отсутствуют!».

 

/* Программа "Простые числа в заданном интервале".

Назначение: выделение простых чисел. */

 

predicates

 

beg

print(integer, integer, integer)

prime_number(integer)

del(integer, integer)

 

clauses

 

beg:-

write("Введите нижнюю границу интервала: "),

readint(A),

write("Введите верхнюю границу интервала: "),

readint(B), A<=B,

write ("Простые числа в интервале [",A,",",B,"]:"),

Nl, print(A,B,0),!.

beg:- write("Неверные начальные данные!"), Nl, fail.

 

print(N,M,R):- N <= M, prime_number(N),

write(N, " "), Q = 1, K = N+1,

print(K,M,Q).

print(N,M,R):- N <= M, K = N+1, print(K,M,R).

print(_,_,0):- write("Отсутствуют!"), Nl.

print(_,_,_):- Nl.

 

prime_number(N):- N = 3.

prime_number(N) :- N > 3, D = N div 2, del(N,D).

 

del(_,1):- !.

del(N,D) :- N mod D = 0, !, fail.

del(N,D) :- E = D-1, E >= 1, del(N,E).

 

На рис. 7 изображено расширенное диалоговое окно с двумя вопросами.

 

 

Рис. 7

 

3.3.5. Ханойские башни

Эта известная головоломка имеет относительно простое и изящное решение в системе Турбо-Пролог. Напомним условие головоломки.

Имеются три стержня, на первом из которых нанизаны кольца с уменьшающимся наверх диаметром (кольцо с наибольшим диаметром находится внизу, с наименьшим – наверху). Требуется перенести пирамиду с первого стержня на третий, расположив кольца в том же порядке. При этом можно выполнять следующие ходы:

1) кольцо с вершины стержня может быть перенесено на любой пустой стержень;

2) обозначим диаметр кольца, находящегося на вершине стержня А через DA, диаметр кольца на вершине стержня В через DB. Кольцо с вершины стержня А может быть перенесено на стержень В, если DA < DB.


Алгоритм переноса, состоящий из наименьшего числа шагов, выполняет в цикле следующие шаги:

в случае нечетного числа колец 1) обмен между стержнями 1 и 3; 2) обмен между стержнями 1 и 2; 3) обмен между стержнями 2 и 3. в случае четного числа колец 1) обмен между стержнями 1 и 2; 2) обмен между стержнями 1 и 3; 3) обмен между стержнями 2 и 3.

 

Обмен понимается как перенос кольца с вершины одного стержня на другой стержень. Например, если D1 < D3, кольцо с первого стержня переносится на третий, в противном случае – с третьего на первый.

Решение этого примера весьма полезно для практического изучения особенностей Турбо-Пролога и его интерпретатора.


 



<== предыдущая лекция | следующая лекция ==>
Встроенные предикаты | ОПРЕДЕЛЕНИЕ И ОСНОВНЫЕ ТРЕБОВАНИЯ.


Карта сайта Карта сайта укр


Уроки php mysql Программирование

Онлайн система счисления Калькулятор онлайн обычный Инженерный калькулятор онлайн Замена русских букв на английские для вебмастеров Замена русских букв на английские

Аппаратное и программное обеспечение Графика и компьютерная сфера Интегрированная геоинформационная система Интернет Компьютер Комплектующие компьютера Лекции Методы и средства измерений неэлектрических величин Обслуживание компьютерных и периферийных устройств Операционные системы Параллельное программирование Проектирование электронных средств Периферийные устройства Полезные ресурсы для программистов Программы для программистов Статьи для программистов Cтруктура и организация данных


 


Не нашли то, что искали? Google вам в помощь!

 
 

© life-prog.ru При использовании материалов прямая ссылка на сайт обязательна.

Генерация страницы за: 0.22 сек.