Мегаобучалка Главная | О нас | Обратная связь


Структура программ Пролога



2018-07-06 399 Обсуждений (0)
Структура программ Пролога 0.00 из 5.00 0 оценок




Программа, написанная на Прологе, состоит из шести основных разделов: раздел объявления доменов, раздел объявления констант, раздел объявления предикатов внутренней базы данных, раздел объявления предикатов, раздел описания предложений и раздел описания цели. Все разделы являются необязательными, кроме раздела цели, который может быть только в единственном числе. Остальные разделы могут повторяться. Ключевые слова domains, constants, facts (старое название database), predicates, clauses и goal отмечают начала соответствующих разделов. Назначение этих разделов таково:

· раздел domains содержит определения доменов, которые описывают различные типы данных, используемых в программе;

· раздел constants используется для объявления символических констант, используемых в программе;

· раздел facts (database) содержит объявления предикатов внутренней базы данных Пролога, если программа такой базы данных не требует, то этот раздел может быть опущен;

· раздел predicates служит для объявления предикатов, не принадлежащих внутренней базе данных;

· в раздел clauses заносятся факты и правила самой программы;

· в разделе goal на языке Пролог формулируется назначение создаваемой программы. Составными частями при этом могут являться некие подцели, из которых формируется единая цель программы.

В Visual Prolog разрешает объявление разделов domains, facts, predicates, clauses как глобальных разделов, то есть с ключевым словом global.

Пролог имеет следующие встроенные типы доменов:

Тип данных Ключевое слово Диапазон значений Примеры использования
Символы char Все возможные символы ‘a’, ’b’, ‘#’, ‘B’, ‘%’
Целые числа integer byte word dword От –32768 до 32767 От 0 до 255 От 0 до 65535 От 0 до -63, 84, 2349
Действительные числа real short ushort long ulong unsigned От +1E-307 до +1E308 16 битов со знаком 16 битов без знака 32 бита со знаком 32 бита без знака 16 или 32 бита без знака 360, - 8324, 1.25E23, 5.15E-9
Строки string Последовательность символов (не более 250) «today», «123», «school_day»
Символические имена symbol 1.Последовательность букв, цифр, символов подчеркивания; первый символ – строчная буква. 2. Последовательность любых символов, заключенная в кавычки. flower, school_day «string and symbol»
Ссылочный тип ref    
Файлы file Допустимое в DOS имя файла mail.txt, LAB.PRO

Если в программе необходимо использовать новые домены данных, то они должны быть объявлены в разделе domains.

Пример 6:

domains

number=integer

name, person=symbol.

Различие между symbol и string - в машинном представлении и выполнении, синтаксически они не различимы. Visual Prolog выполняет автоматическое преобразование типов между доменами string и symbol. Однако, по принятому соглашению, символическую строку в двойных кавычках нужно рассматривать как string, а без кавычек – как symbol:

Visual Prolog поддерживает и другие типы стандартных доменов данных, например, для работы с внешними БД или объектами.

Предикаты описываются в разделе predicates. Предикат представляет собой строку символов, первым из которых является строчная буква. Предикаты могут не иметь аргументов, например «go» или «repeat». Если предикаты имеют аргументы, то они определяются при описании предикатов в разделе predicates:

Пример 7:

predicates

mother (symbol, symbol)

father (symbol, symbol).

Предикаты внутренней (динамической) базы данных пролога объявляются в разделе facts. Предикаты, объявленные в данном разделе, могут присутствовать в программе только в виде фактов. Синтаксически предикаты раздела facts не отличаются от предикатов раздела predicates. Предикаты раздела facts могут удаляться, добавляться или модифицироваться во время исполнения программы. Если есть необходимость в наличии нескольких разделов facts, то каждый раздел должен объявляться с собственным именем, например:

facts – my_data.

Факты и правила определяются в разделе clauses, а вопрос к программе задается в разделе goal. В Visual Prolog раздел goal в тексте программы является обязательным. Разница в режимах исполнения программы состоит в разном использовании утилиты Test Goal. Если утилита создается для запуска любой программы, то при этом ищутся все решения, если утилита создается для автономного запуска программы – то ищется одно решение.

Использование списков

Список является составной рекурсивной структурой данных, хотя явно и не объявляется как рекурсивная структура. Список – это упорядоченный набор объектов одного и того же типа. Элементами списка могут быть целые числа, действительные числа, символы, строки, символические имена и структуры. Порядок расположения элементов в списке играет важную роль: те же самые элементы списка, упорядоченные иным способом, представляют уже совсем другой список.

Совокупность элементов списка заключается в квадратные скобки ([]), элементы друг от друга отделяются запятыми. Список может содержать произвольное число элементов, единственным ограничением является объем оперативной памяти. Количество элементов в списке называется его длиной. Список может содержать один элемент и даже не содержать ни одного элемента. Список, не содержащий элементов, называется пустым или нулевым списком.

Непустой список можно рассматривать как список, состоящий из двух частей: головы – первого элемента списка; и хвоста – остальной части списка. Голова является элементом списка, хвост является списком. Голова списка – это неделимое значение, хвост представляет собой список, составленный из того, что осталось от исходного списка в результате «отделения головы». Этот новый список обычно можно делить и дальше. Если список состоит из одного элемента, то его можно разделить на голову, которой будет этот самый элемент, и хвост, являющийся пустым списком.

Пустой список нельзя разделить на голову и хвост!

Операция деления списка на голову и хвост обозначается при помощи вертикальной черты (|):

[Head | Tail].

Голова списка всегда имеет тип элемента списка, хвост списка – тип списка!

Head здесь является переменной для обозначения головы списка, переменная Tail обозначает хвост списка (для имен головы и хвоста списка пригодны любые допустимые Прологом имена).

Данная операция также присоединяет элемент в начало списка, например, для того, чтобы присоединить X к списку S следует написать [X|S].

В концептуальном плане, список имеет структуру дерева, как и другие составные термы. Так, например, список [a,b,c] можно представить в виде структуры:

 

 

 
 

 

 


Отличительной особенностью описания списков является наличие звездочки (*) после имени домена элементов.

Пример 8: объявление списков, состоящих из элементов стандартных типов доменов или типа структуры.

domains

list1=integer*

list2=char*

list3=string*

list4=real*

list5=symbol*

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

list6= personal_library*

list7=list1*

list8=list5*

В первых пяти объявлениях списков в качестве элементов используются стандартные домены данных, в шестом типе списка в качестве элемента используется домен структуры personal_library, в седьмом и восьмом типе списка в качестве элемента используется ранее объявленный список.

Пример 9: демонстрация разделения списков на голову и хвост.

Список Голова Хвост
[1, 2, 3, 4, 5] 1 [2, 3, 4, 5]
[6.9, 4.3] 6.9 [4.3]
[cat, dog, horse] Cat [dog, horse]
[‘S’, ‘K’, ‘Y’] ‘S’ [‘K’, ‘Y’]
[«PIG»] «PIG» []
[] Не определена Не определен

Visual Prolog допускает объявление и использвание составных списков. Составной список – это список, в котром используется более чем один тип элемента. Для создания такого списка, необходимо использовать структуры, так как домен может содержать более одного типа данных только для структуры.

Пример 10: объявление списка, который может содержать символы, целые числа или строки:

domains

llist=i(integer);c(char);s(string)

list=llistl*

Подобный список выглядит следующим образом: L=[i(1),i(-2),c(‘a’),string(“hello”),c(‘b’)].

Для применения списков в программах на Прологе необходимо описать домен списка в разделе domains, предикаты, работающие со списками необходимо описать в разделе predicates, задать сам список можно либо в разделе clauses либо в разделе goal.

Над списками можно реализовать различные операции: поиск элемента в списке, разделение списка на два списка, присоединение одного списка к другому, удаление элементов из списка, сортировку списка, создание списка из содержимого БД и так далее.



2018-07-06 399 Обсуждений (0)
Структура программ Пролога 0.00 из 5.00 0 оценок









Обсуждение в статье: Структура программ Пролога

Обсуждений еще не было, будьте первым... ↓↓↓

Отправить сообщение

Популярное:
Личность ребенка как объект и субъект в образовательной технологии: В настоящее время в России идет становление новой системы образования, ориентированного на вхождение...
Почему люди поддаются рекламе?: Только не надо искать ответы в качестве или количестве рекламы...



©2015-2024 megaobuchalka.ru Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. (399)

Почему 1285321 студент выбрали МегаОбучалку...

Система поиска информации

Мобильная версия сайта

Удобная навигация

Нет шокирующей рекламы



(0.008 сек.)