Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
IIS / Печень О.А / Тема 2 / ЛР 2 1 - Prolog знакомство.doc
Скачиваний:
30
Добавлен:
31.03.2015
Размер:
204.8 Кб
Скачать
  1. Секция 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)

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

  1. Секция 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). Считается, что между этими двумя правилами неявно присутствует соединительный союз "или".