1 Solution

что является суммой двух целых чисел, которые вы передали в программу.

С другой стороны, эта же программа с помощью предиката multiply_em умножает два аргумента. Допустим, мы хотим удвоить произведение 31 на 17. Задаем следующую цель:

multiply_em(31, 17, Sum), add_em_up(Sum, Sum, Answer).

и ждем, что Visual Prolog (Test Goal) ответит:

Sum=527, Answer=1054

1 Solution

Однако вместо этого вы получите ошибку типа. Это случилось из-за того, что имела место попытка передать результирующее значение предиката multiply_em, которое относится к домену product, в качестве первого и второго аргументов (которые должны относится к домену sum) в предикат add_em_up. И хотя оба эти домена соответствуют типу integer — это различные домены.

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

 

13. Раздел цели

По существу, раздел goal (цели) аналогичен телу правила: это просто список подцелей. Цель отличается от правила лишь следующим:

·           за ключевым словом goal не следует :-;

·           при запуске программы Visual Prolog автоматически выполняет цель.

Если все подцели в разделе goal истинны, — программа завершается успешно. Если же какая-то подцель из раздела goal ложна, то считается, что программа завершается неуспешно (хотя чисто внешне никакой разницы в этих случаях нет, — программа просто завершит свою работу).

14. Декларации и правила

В Visual Prolog есть несколько встроенных стандартных доменов. Их можно использовать при декларации типов аргументов предикатов без описания в разделе domains.

Основные стандартные домены перечислены в табл. 1.

Таблица 1. Основные стандартные домены

Домен Описание Реализация
short Короткое, знаковое, количественное Все платформы 16 бит (-32 768—32 767)
ushort Короткое, беззнаковое, количественное Все платформы 16 бит (0—65 535)
long Длинное, знаковое, количественное Все платформы 32 бит (-2 147 483 648-2 147 483 647)
ulong Длинное, беззнаковое, количественное Все платформы 32 бит (0-4 294 967 295)
integer Знаковое, количественное, имеет платформо-зависимый Платформы 1 6 бит (-32 768-32 767)
размер Платформы 32 бит (-2 147 483 648-2 147 483 647)
unsigned Беззнаковое, количественное, имеет платформо-зависимый размер Платформы 16 бит (0—65 535) Платформы 32 бит (0-4 294 967 295)
byte Все платформы 8 бит (0— 55)
word Все платформы 16 бит (0—65 535)
dword Все платформы 32 бит (0—4 294 967 295)

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

Домены типов byte, word и dword наиболее удобны при работе с машинными числами. В основном используются типы integer и unsigned, а также short и long (и их беззнаковые аналоги) для более специализированных приложений.

В объявлениях доменов ключевые слова signed и unsigned могут использоваться вместе со стандартными доменами типов byte, word и dword для построения новых базовых доменов. Так:

domains

i8 = signed byte

создает новый базовый домен в диапазоне от -128 до +127.

Другие базовые домены показаны в табл. 2[1].

 

Таблица 2. Основные стандартные домены

Домен Описание и реализация
char Символ, реализуемый как беззнаковый byte. Синтаксически это символ, заключенный между двумя одиночными кавычками: 'а'
real Число с плавающей запятой, реализуемое как 8 байт в соответствии с соглашением IEEE; эквивалентен типу double в С. При необходимости, целые автоматически преобразуются в real
string

Последовательность символов, реализуемых как указатель на байтовый массив, завершаемый нулем, как в С. Для строк допускается два формата:1. Последовательность букв, цифр и символов подчеркивания, причем первый символ должен быть строчной буквой.2. Последовательность символов, заключенных в двойные кавычки.

Примеры строк:

telephone_number "railway ticket" "Dorid Inc"

Строки, которые пишутся в программе, могут достигать длины в 255 символов, в то время как строки, которые система Visual Prolog считывает из файла или строит внутри себя, могут достигать (теоретически) до 4 Гбайт на 32-битных платформах

symbol Последовательность символов, реализуемых как указатель на вход в таблице идентификаторов, хранящей строки идентификаторов. Синтаксис — как для строк

Идентификаторы и строки взаимозаменяемы в программе, однако Visual Prolog хранит их раздельно. Идентификаторы хранятся в таблице идентификаторов, а для представления используются лишь их индексы в этой таблице, но не сами строки идентификаторов. Это означает, что сопоставление идентификаторов выполняется очень быстро, а в случае если они встречаются в программе несколько раз, то и хранение их компактно. Строки же не хранятся в поисковой таблице, и при необходимости сопоставления Visual Prolog проверяет их символ за символом. Вы сами должны определять, какой домен лучше использовать в каждой конкретной программе.

Задание типов аргументов при декларации предикатов

Объявление доменов аргументов в разделе predicates называется заданием типов аргументов. Предположим, имеется следующая связь объектов:

Франк — мужчина, которому 45 лет.

Факт Пролога, соответствующий этому предложению естественного языка, может быть следующим:

person(frank, male, 45).

Для того чтобы объявить person (человек), как предикат с этими тремя аргументами, вы можете разместить в разделе predicates следующую строку:

person(symbol, symbol, unsigned).

Здесь для всех трех аргументов использованы стандартные домены. Отныне всякий раз при работе с предикатом person, вы должны передавать ему три аргумента, причем первые два должны быть типа symbol, а третий — типа integer.

Если в программе используются только стандартные домены, то нет необходимости использовать раздел domain; вы уже видели несколько программ такого типа.

Или, предположим, что вы хотите описать предикат, который сообщал бы позицию буквы в алфавите, т. е. цель

alphabet_position(Letter, Position)

должна вернуть вам Position = 1, если Letter = a, Position = 2, если Letter = Ь и т. д. Предложения этого предиката могут выглядеть следующим образом:

alphabet_position(A_character, N).

Если при объявлении предиката используются только стандартные домены, то программе не нужен раздел domains. Предположим, что вы хотите описать предикат так, что цель будет истинна, если A_character является N-м символом алфавита. Предложения этого предиката будут такими:

alphabet_position('а', 1). alphabet_position('b', 2).

alphabet_position('с', 3).

alphabet_position(' z1, 26).

Вы можете объявить данный предикат следующим образом:

predicates

alphabet_position(char, unsigned)

и тогда вам не будет нужен раздел domains. Если разместить все фрагменты программы вместе, получим:

predicates

alphabet_position(char, integer)

clauses

alphabet_position('a', 1).

alphabet_position('b', 2) .

alphabet_position('c', 3).

% здесь находятся остальные буквы

alphabet_position('z', 26).

Ниже представлено несколько простых целей, которые вы можете использовать:

alphabet_position ('а', 1).

alphabet_position(X, 3).

alphabet_position (' z', What).

Арность (размерность)

Арность предиката — это количество аргументов, которые он принимает. Вы можете иметь два предиката с одним и тем же именем, но отличающейся арностью. В разделах predicates и clauses версии предикатов с одним именем и разной арностью должны собираться вместе; за исключением этого ограничения, различная арность всегда понимается как полное различие предикатов. Проиллюстрируем это примером/

domains

person = symbol

predicates

father(person)% этот person — отец

father(person, person)% первый person является отцом другого

clauses

father (Man) :-father(Man, _) .

father(adam,seth).

father(abraham,isaac).

Синтаксис правил

Правила используются в Прологе в случае, когда какой-либо факт зависит от истинности другого факта или группы фактов. Как мы объясняли ранее в этой главе, в правиле Пролога есть две части: заголовок и тело. Ниже представлен обобщенный синтаксис правила в Visual Prolog:

HEAD: - <Subgoal>, <Subgoal>, ..., <Subgoal>.

Заголовок: — <Подцель>, <Подцель>, ... , <Подцель>.

Тело правила состоит из одной или более подцелей. Подцели разделяются запятыми, определяя конъюнкцию, а за последней подцелью правила следует точка.

Каждая подцель выполняет вызов другого предиката Пролога, который может быть истинным или ложным. После того, как программа осуществила этот вызов, Visual Prolog проверяет истинность вызванного предиката, и если это так, то работа продолжается, но уже со следующей подцелью. Если же в процессе такой работы была достигнута точка, то все правило считается истинным; если хоть одна из подцелей ложна, то все правило ложно.

Для успешного разрешения правила Пролог должен разрешить все его подцели и создать последовательный список переменных, должным образом связав их. Если же одна из подцелей ложна, Пролог вернется назад для поиска альтернативы предыдущей подцели, а затем вновь двинется вперед, но уже с другими значениями переменных. Этот процесс называется поиск с возвратом.

Как упоминалось выше, в качестве разделителя заголовка и тела правила Пролог использует знак:-, который читается как "если" (if). Однако if Пролога отличается от if, написанного в других языках, например в Pascal, где условие, содержащееся в операторе if, должно быть указано перед телом оператора, который может быть выполнен. Другими словами:

если ЗАГОЛОВОК истинен, тогда ТЕЛО истинно (или: тогда выполнить ТЕЛО

Данный тип оператора известен как условный оператор если/тогда (if/then). Пролог же использует другую форму логики в таких правилах. Вывод об истинности заголовка правила Пролога делается, если (после того, как) тело этого правила истинно, например, так:

ЗАГОЛОВОК истинен, если ТЕЛО — истинно (или: если ТЕЛО может Сыть выполнено).

Учитывая вышесказанное, правило Пролога соответствует условной форме тогда/если (then/if).

Автоматическое преобразование типов

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

·           между строками (string) и идентификаторами (symbol);

·           между целыми, действительными и символами (char). При преобразовании символа в числовое значение этим значением является величина символа в коде ASCII.

Аргумент из домена my_dom, который объявлен следующим образом:

domains

my_dom = <base domain> % <base domain> — это стандартный домен

может свободно смешиваться с аргументами из этого основного домена и с аргументами всех совместимых с ним стандартных доменов. Если основной домен — string, то с ним совместимы аргументы из домена symbol; если же основной домен integer, то с ним совместимы домены real, char, word и др. Такое преобразование типов означает, например, что вы можете:

·           вызвать предикат с аргументами типа string, задавая ему аргументы типа symbol, и наоборот;

·           передавать предикату с аргументами типа real параметры типа integer;

·           передавать предикату с аргументами типа char параметры типа integer;

·           использовать в выражениях и сравнениях символы без необходимости получения их кодов в ASCII.

Существует набор правил, определяющих, к какому домену принадлежит результат смешивания разных доменов. Эти правила будут детально рассмотрены далее.

15. Другие разделы программ

Теперь, когда вы ознакомились с такими разделами программ Visual Prolog, как clauses, predicates, domains и goal, поговорим о некоторых других, часто используемых разделах программ: facts, constants и различных глобальных (global) разделах.

Раздел фактов

Программа на Visual Prolog представляет собой набор фактов и правил. Иногда в процессе работы программы бывает необходимо модифицировать (изменить, удалить или добавить) некоторые из фактов, с которыми она работает. В этом случае факты рассматриваются как динамическая или внутренняя база данных, которая при выполнении программы может изменяться. Для объявления фактов программы, рассматривающихся как части динамической (или изменяющейся) базы данных, Visual Prolog включает специальный раздел — facts.

Ключевое слово facts объявляет раздел фактов. Именно в этой секции вы объявляете факты, включаемые в динамическую базу данных. Отметим, что в ранних версиях Visual Prolog для объявления раздела фактов использовалось ключевое слово database, т. е. ключевое слово facts — синоним устаревшего ключевого слова database. В Visual Prolog есть несколько встроенных предикатов, облегчающих использование динамических фактов.

Раздел констант

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

<id> = <Макроопределение>

<id>— имя символической константы, а <макроопределение> — это то, что вы присваиваете этой константе. Каждое <макроопределение> завершается символом новой строки и, следовательно, на одной строке может быть только одно описание константы. Объявленные таким образом константы могут позже использоваться в программах.

Рассмотрим следующий фрагмент программы:

constants

zеrо = О

one = 1

two = 2

hundred = (10*(10-1)+10)

pi = 3.141592653

ega = 3

slash_fill = 4

red = 4

Перед компиляцией программы Visual Prolog заменит каждую константу на соответствующую ей строку.

На использование символических констант накладываются следующие ограничения:

·           описание константы не может ссылаться само на себя:

my_number = 2*my_number/2 % не допускается

·           это приведет к сообщению об ошибке "Recursion in constant definition" (Рекурсия в описании константы);

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

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

·           идентификаторы констант являются глобальными и могут объявляться только один раз. Множественное объявление одного и того же идентификатора приведи к сообщению об ошибке "Constant identifier can only be declared once" (Идентификатор константы может объявляться только один раз).

Директивы компилятора

Visual Prolog поддерживает несколько директив компилятора, которые можно добавлять в программу для сообщения компилятору специальных инструкций по обработке вашей программы при ее компиляции. Кроме этого, вы можете устанавливать большинство директив компилятора с помощью команды меню среды визуальной разработки Visual Prolog Options/Project/Compiler Options.

Директива include

Для того чтобы избежать многократного набора повторяющихся процедур, вы можете использовать директиву include.

Ниже приведен пример того, как это делается.

1.         Создаете файл (например, MYSTUFF.PRO), в котором объявляете свои наиболее I часто используемые предикаты (с помощью разделов domains и predicates) и даете их описание в разделе clauses.

2.         Пишете исходный текст программы, которая будет использовать эти процедуры.

3.         В "допустимых областях" исходного текста программы размещаете строку:include "mystuff.pro"

"Допустимые области" — это любое место программы, в котором вы можете расположить декларацию разделов domains, facts, predicates, clauses или goal.

При компиляции исходных текстов программы Visual Prolog вставит содержание файла MYSTUFF.PRO прямо в окончательный текст файла для компиляции.

Директиву include можно использовать для включения в исходный текст (практически любого) часто используемого фрагмента. Кроме того, любой включаемый в программу файл может, в свою очередь, включать другой файл (однако каждый файл может быть включен в вашу программу только один раз).


II. Унификация и поиск с возвратом

 

1. Сопоставление и унификация

Рассмотрим программу ch04e01.pro (рис.1) с точки зрения того, как утилита Test Goal будет отыскивать все решения следующей цели written_by(X, Y).

domains

title, author = symbol

pages= unsigned

predicates

book(title, pages)

written_by(author, title)

long_novel (title)

clauses

written_by(fleming, "DR NO").

written_by(melville, "MOBY DICK").

book("MOBY DICK", 250).

book("DR NO", 310).

long_novel (Title) :-

written_by(_, Title),

book(Title, Length),

Length > 300.

Рис. 1.           Листинг программы ch04e01.pro

Пытаясь выполнить целевое утверждение written_by(X, Y), Visual Prolog должен проверить каждое предложение written_by(X, Y) в программе. Сопоставляя аргументы X и Y с аргументами каждого предложения written_by, Visual Prolog выполняет поиск от начала программы до ее конца. Обнаружив предложение, соответствующее целевому утверждению, Visual Prolog присваивает значения свободным переменным таким образом, что целевое утверждение и предложение становятся идентичными. Говорят, что целевое утверждение унифицируется с предложением. Такая операция сопоставления называется унификацией.

Поскольку X и Y являются свободными переменными в целевом утверждении, а свободная переменная может быть унифицирована с любым другим аргументом (и даже с другой свободной переменной), то целевое утверждение может быть унифицировано с первым предложением written_by в программе, как показано ниже:

written_by (X,Y).

¯¯

written_by(fleming,"DR NO").

Visual Prolog устанавливает соответствие, X становится связанным с fleming, a Y – “dr no”. В этот момент Visual Prolog напечатает:

X=fleming, Y="DR NO"

Поскольку Test Goal ищет все решения для заданной цели, целевое утверждение также будет унифицировано и со вторым предложением written_by:

written_by(melville, "MOBY DICK").

Test Goal печатает второе решение:

X=melville, Y="MOBY DICK"


Информация о работе «Язык логического программирования Visual Prolog»
Раздел: Информатика, программирование
Количество знаков с пробелами: 80531
Количество таблиц: 5
Количество изображений: 5

Похожие работы

Скачать
107375
20
21

... отдаетесь учебе? YTS ·  Yes ·  No На основе этих данных построим базу знаний продукционной модели с помощью простой конструкции : Если (условие), то (действие), Набор правил для экспертной системы прогнозирования сдачи сессии студентами на основании текущей успеваемости: 3.  If LIO=”Yes” and LIK=”Yes” then LI = “Yes” 4.  If LIO=”Yes” and LIK=”No” then LI = “Yes” 5.  If LIO=”No” ...

Скачать
141139
6
10

... названием "Prolog", а внутри него ярлык на файл "Prolog.exe" с названием "Prolog with databases", ярлык на help-файл и на файл "readme.txt". 3.3 Руководство пользователя программы интерпретатора языка Пролог 3.3.1 Запуск программы Запуск программы можно произвести несколькими способами. Нажать кнопку "Пуск", выбрать в меню пункт "Программы", выбрать пункт "Prolog". После того, как ...

Скачать
57924
2
2

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

Скачать
110612
10
19

... набор процедур и функций языков программирования Basic и Pascal, позволяют управлять графическим режимом работы экрана, создавать разнооборазные графические изображения и выводить на экран текстовые надписи. ГЛАВА 2. ГРАФИЧЕСКИЕ ВОЗМОЖНОСТИ ЯЗЫКА ПРОГРАММИРОВАНИЯ В КУРСЕ ИНФОРМАТИКИ БАЗОВОЙ ШКОЛЫ (НА ПРИМЕРЕ BASIC И PASCAL)   2.1 Разработка мультимедиа курса «Графические возможности языков ...

0 комментариев


Наверх