- •Лабораторная работа № 3 Программирование интеллектуальных систем на языке Пролог Знакомство с языком Пролог
- •Введение
- •Элементы языка Турбо-Пролог
- •Структура программ Турбо-Пролога
- •Секция domains Пролог-программы
- •Секция predicates
- •Секция clauses
- •Секция goal
- •Секция database
- •Оболочка системы Турбо-Пролог
- •Отладка и трассировка программ
- •Служебные предикаты Турбо-Пролога
- •Порядок выполнения лабораторной работы
Секция predicates
В секции predicates объявляются предикаты и типы (домены) аргументов этих предикатов. Имена предикатов должны начинаться со строчной латинской буквы, за которой следует последовательность букв, цифр и символов подчеркивания (до 250 знаков). В именах предикатов нельзя использовать символы пробела, минуса, звездочки, обратной (и прямой) черты. Объявление предикатов имеет форму:
predicates
predicateName1 (domen11, domen12,..., domen1m) predicateNamen (domenn1, domenn2,..., domennk)
Здесь domenij - либо стандартные домены, либо домены, объявленные в секции domains. Объявление домена аргумента и описание типа аргумента - суть одно и то же. Количество доменов (аргументов) предиката определяют арность (размерность) предиката. Предикат может не иметь аргументов и указываться только именем. Обычно выбирается такое имя предиката, чтобы оно отражало определенный вид взаимосвязи между аргументами предиката. Пример описания предикатов:
predicates
student( string,real) start good_student( string)
Можно использовать несколько описаний одного и того же предиката. При этом все описания должны следовать одно за другим и должны иметь одно и то же число аргументов. Пусть требуется определить отношение между тремя аргументами, первые два из которых соответствуют слагаемым, а третий - сумме двух первых. Этот предикат может быть описан в следующем виде
predicates
add(integer,integer,integer) add(real,real,real)
и позволит его аргументам принимать значения как из области целых, так и действительных чисел.
Секция clauses
В секции clauses размещаются факты и правила, с которыми будет работать Турбо-Пролог, пытаясь разрешить цель программы.
Факт - это утверждение о существовании некоторого отношения между аргументами, обозначаемого именем предиката. Факты - это фразы без условий и они содержат утверждения, которые всегда абсолютно верны. Форма записи фактов:
clauses
predicateName1 (term11, term12,..., term1к). , ... predicateNameN (termN1, terniN2,..., termNL).
где predicateNamel - имена предикатов, описанных в секции predicates , a term11, ... , term11 - аргументы предикатов (термы), количество которых должно соответствовать арности описания предиката. Пример фактов, определяющих отношение, заданное предикатом student, может иметь вид:
clauses
student("Петров" ,4.5). student("Сидоров" ,3.75).
Правила содержат утверждения, истинность которых зависит от некоторых условий (подцелей), образующих тело правила. В Прологе правила представляются в виде
Заголовок :- Подцель1 , Подцель2 , ... , ПодцельN . ,
где обозначение :- читается как "если", а Заголовок имеет такую же форму, как и факт. Тело правила - это список подцелей, разделенных запятыми. Запятая понимается как конъюнкция и читается как "и". Пример записи правила
good_student( Name ) :- student( Name , В ) , В > 4.
Для того, чтобы заголовок правила оказался истинным, необходимо, чтобы каждая подцель, входящая в тело правила, была истинной. Переменные в заголовке правила, квантифицированы универсально. Это означает, что правило, заголовок которого содержит переменные, будет истинным для любых термов, удовлетворяющих подцелям правила. С другой стороны переменные, входящие только в тело правила, квантифицированы экзистенциально. Если учесть такую квантификацию, то приведенное выше правило можно прочитать так:
Для любого лица Name, Name является хорошим студентом | |
ЕСЛИ |
существует средний балл В такой, что Name является студентом со средним баллом В |
И |
средний балл В больше 4. |
Множество правил, заголовки которых содержат одинаковые имена предикатов и количество аргументов, называются процедурой. В Прологе предикаты определяются (реализуются) при помощи процедур. Так следующие два правила
max( Х , Y , X) :- Х >=Y. max( Х , Y , Y) :- Х < Y.
реализуют процедуру нахождения наибольшего из двух чисел, определяемую предикатом вида max(number1, number2, max_number). Считается, что между этими двумя правилами неявно присутствует соединительный союз "или".