Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

3512

.pdf
Скачиваний:
16
Добавлен:
08.01.2021
Размер:
575.58 Кб
Скачать

21

Правилаутверждения, зависящие от условий. Например, child(ann,bob) :- parent(bob,ann). /* Энн - дитя Боба, если Боб –

родитель Энн */

или

father(X,Y) :-parent(X,Y),man(X ). /* Для всех X и Y X является отцом Y,

если X является родителем Y и X – мужчина */

Правила используются для определения новых предикатов через уже имеющиеся. Так, мы определяем предикат child (ребенок) через предикат parent (родитель).

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

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

Например: man(tom). man(bob).

man(jim). /* предикат, описывающий мужчину */

woman(ann). /* предикат, описывающий женщину */

parent(tom,ann).

parent(ann, bob). /* предикат, описывающий родителя */

ВТурбо-Прологе требуется, чтобы предложения каждой процедуры были сгруппированы в одном месте.

Впредикатах объекты (аргументы) могут быть конкретными или абстрактными. Конкретный объект в простейшем случае задается именем. В Прологе действует соглашение, что имя – это идентификатор, начинающийся с маленькой буквы.

Абстрактный объект – это переменная. Переменная обозначается

22

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

Особо выделяется анонимная переменная – знак подчеркивания ‘_’. Анонимная переменная предписывает Пролог-системе проигнорировать значение аргумента.

Цель - вопрос пользователя к системе о том, какие утверждения являются истинными.

Для указанных выше примеров на вопрос

child(ann,bob) /* является ли Энн ребенком Боба ?*/ будет выдан ответ

true /* истина */, а на вопрос

father(X,ann) /* кто является отцом Энн ? */ будет выдан ответ

X = Bob /* отцом Энн является Боб */.

На все поставленные вопросы Пролог пытается ответить с помощью фактов и правил вывода. Он решает задачу, просматривая программу сверху вниз и слева направо. Сначала анализируется цель и ведется поиск такого факта или правила вывода, с помощью которого она может быть достигнута. При нахождении такого факта после соответствующей подстановки переменных Пролог переходит к анализу следующей цели при условии, что предыдущая достигнута (доказана). Если некоторая цель последняя, доказательство заканчивается. При отсутствии нужных фактов, но наличии правила вывода, которое могло быть применено, цель заменяется условием этого правила с соответствующей подстановкой переменных. Теперь условием выполнения цели становится доказательство условия (правой части) правила вывода. Процесс нахождения соответствия между целью и фактом или правилом называется унификацией. В ходе унификации Пролог ищет все альтернативные решения.

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

domains

/*(домены) - раздел объявлений*/; database

23

/* описания предикатов динамической базы данных */ predicates

/* описания предикатов */ goal

/* целевое утверждение */ clauses

/* утверждения - факты и правила */

В программе, по крайней мере, должны быть разделы predicates и clauses. Раздел domains напоминает объявление данных в традиционных (императивных) языках, например таких, как Паскаль и Си. Существуют

следующие типы доменов: char (символьный), integer (целый),

real (вещественный), string (строковый),

symbol (для цепочки из букв, цифр и символов подчеркивания с первой строчной буквой либо цепочки знаков в двойных кавычках),

file (файловый).

По отношению к именам объектов (идентификаторам) в Прологе используются следующие правила:

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

2)имена символических констант должны начинаться со строчной буквы;

3)в имени можно использовать одновременно и строчные и прописные буквы.

Рассмотрим примеры программ на языке Турбо-Пролог.

Пример 1.Родственные отношения

domains

s=symbol /* объект s имеет тип symbol */ predicates

24

parent(s,s) female(s)

male(s) mother(s,s) father(s,s) ancestor(s,s) child(s,s)

clauses

parent(pam, bob). /* Пам - родитель Боба */ parent(tom, bob).

parent(tom, liz). parent(bob, ann). parent(bob, pat). parent(pat, jim).

female(pam). /* Пам - женщина */ female(liz). female(ann). female(pat).

male(tom). /* Том - мужчина */ male(bob). male(jim).

child(Y,X):- /* Y - отпрыск X, если X - родитель Y */ parent(X,Y).

mother(X,Y):- /* X - мать Y, если */ parent(X,Y),female(X). /* X - родитель Y и X - женщина */

father(X,Y):- /* X - отец Y, если */ parent(X,Y),male(X). /* X - родитель Y и X - мужчина */

ancestor(X,Z):-

/* X - предок Z, если */

parent(X,Z).

/* X - родитель Z */

ancestor(X,Z):-

/* X - предок Z, если */

parent(X,Y),ancestor(Y,Z). /* X - родитель Y и Y - предок Z */

Пример 2. Ориентированный граф

25

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

domains point=symbol

predicates arc_(point,point) line_(point,point)

tr(point,point,point) clauses

/* описание существующих дуг в графе */

arc_(a,c). arc_(b,c). arc_(c,d). arc_(d,a). arc_(d,e). arc_(c,b). arc_(a,f). /* условие того, что вершины A и B связаны двумя противоположно

направленными дугами */ line_(A,B):-arc_(A,B),arc(B,A).

/* условие того, что три следующих друг за другом дуги образуют треугольник */

tr(X,Y,Z):-arc_(X,Y),arc_(Y,Z),arc_(Z,X).

После запуска программы на выполнение в окне Dialog экрана появится строка Goal:. Введем, например, line(X,Y). В результате получим: X=b, Y=c, X=c, Y=b 2 Solutions, т.е. найдено два решения. Точно так же можно ставить вопросы для отношений arc_ и tr. Например, если ввести: arc_(a,b), результатом будет false (ложь), а если ввести arc(a,f), -true ( истина ). На вопрос arc_(F,c) Пролог выдаст два решения: F=a и F=b.

Пример 3. Отношение "нравится"

predicates likes(symbol,symbol) clauses

likes(ellen, tennis). /* Эллен нравится теннис */

likes(john, football). likes(tom, baseball). likes(eric, swimming). likes(mark, tennis).

26

/* Биллу нравится то же, что и Тому */ likes(bill, Activity) if likes(tom, Activity).

Пример 4. Отношение «может купить»

predicates

can_buy(symbol, symbol) /* отношение "может купить" */

person(symbol)

/* отношение "субъект */

car(symbol)

/* отношение "марка автомобиля" */

likes(symbol, symbol)

for_sale(symbol) /* отношение "продается" */

clauses

can_buy(X, Y) :- person(X), car(Y), likes(X, Y), for_sale(Y). person(kelly). person(judy).

car(lemon). car(hot_rod).

likes(kelly, hot_rod). likes(judy, pizza).

for_sale(pizza). for_sale(lemon). for_sale(hot_rod).

Задачи и упражнения для самостоятельного решения

1. Родственные отношения. Кроме родственных отношений parent (родитель) и ancestor (предок) программа должна содержать хотя бы одно из следующих отношений:

1.1.brother (брат);

1.2.sister (сестра);

1.3.grand-father (дедушка);

1.4.grand-mother (бабушка);

1.5.uncle (дядя).

2.Ориентированные графы. Описать граф. Задать отношения, позволяющие определить наличие в графе:

2.1. путей между произвольной парой вершин; 2.2. многоугольников с заданным числом сторон (например,

27

четырехугольников).

3.Отношения likes ("нравится") и can_buy ("может купить"). Описать указанные отношения для следующих комбинаций "субъекты - предметы":

3.1.субъекты - фрукты; 3.2.субъекты - марки автомобилей; 3.3.субъекты - фильмы; 3.4.субъекты - книги.

Лабораторная работа № 4.

Тема: «Элементы теории алгоритмов. Машины Тьюринга»

Цель работы: получить представление об одной из формализаций интуитивного понятия алгоритма — о машинах Тьюринга.

Машина Тьюринга полностью определяется:

а) внешним алфавитом А = {а0, а1, ..., аn}, где а0 — символ пустой ячейки, a1 = 1;

б) алфавитом внутренних состояний Q = {q0, q1, ..., qm}, где q0

состояние остановки: попав в него, машина прекращает работу; q1 начальное состояние: в этом состоянии машина начинает работать;

в) программой (или функциональной схемой), т.е. совокупностью выражений T(i, j)(i=1, ..., m; j = 0, 1, ..., n), каждое из которых имеет один из следующих видов: qiaj qkal, qiaj qkalП, qiaj qkalЛ, где 0 k m, 0 ln. Выражения T(i, j) называют командами.

Наглядно устройство и работу машины Тьюринга можно представить себе следующим образом. Машина имеет бесконечную в обе стороны ленту, разбитую на ячейки. В каждой ячейке записана ровно одна буква из внешнего алфавита А (запись буквы а0 означает, что ячейка пуста). В каждый момент времени (такт работы) машина находится в одном из состояний, обозначаемых буквами алфавита внутренних состояний, и «обозревает» точно одну ячейку ленты («читает» информацию, записанную в ячейке). По команде qiaj qkalX (где Х= П или Х= Л, или X отсутствует), означающей, что машина находится в состоянии qi и обозревает ячейку, в которой записана буква аj, машина переходит в состояние qk, в обозреваемой ячейке стирает букву аj и заносит

28

туда букву аl. Затем машина переходит к обозрению ячейки, следующей справа или слева от предыдущей в зависимости от того Х= П или Х= Л соответственно, или же продолжает обозревать предыдущую ячейку, если место Х в команде не заполнено. После выполнения указанной команды машина на следующем такте переходит к выполнению команды qkal qrasX т.д.

Словом в алфавите А или в алфавите Q, или в алфавите A Q называется любая последовательность букв соответствующего алфавита. Под k-й конфигурацией будем понимать изображение ленты машины с информацией, сложившейся на ней к началу k-го такта (или слово в алфавите А, записанное на ленте к началу k-го такта), и с указанием того, какая ячейкаобозревается в этот такт и в каком состоянии находится машина. Имеют смысл лишь конечные конфигурации, т.е. такие, в которых все ячейки ленты, за исключением, быть может, конечного числа их, пусты.

Будем говорить, что непустое слово w в алфавите А\{а0} = {a1,..., аn} воспринимается машиной в стандартном положении, если это слово записано в последовательных ячейках ленты, все другие ячейки пусты и машина обозревает крайнюю справа ячейку из тех, в которых записано слово w. Стандартное положение называется начальным (заключительным), если машина, воспринимающая слово в стандартном положении, находится в начальном состоянии q1 (соответственно в состоянии остановки q0). Далее будем говорить, что слово w перерабатывается машиной в слово v, если от слова w, воспринимаемого в начальном стандартном положении, машина после выполнения конечного числа команд приходит к слову v, воспринимаемому в положении остановки.

Пусть на некотором множестве слов алфавита {a1,,..., аl} задана k-местная функция, значениями которой являются слова в том же алфавите. Предположим, что имеется машина Тьюринга с алфавитом А = {а0, a1,..., ап} (n > l), которая любой набор из k слов, входящий в область определения функции, записанный на ленту последовательно с промежутками в одну ячейку между словами, перерабатывает в слово, являющееся значением функции на этом наборе, а на любом наборе из k слов, не входящем в область определения функции, машина работает бесконечно. Тогда про такую машину Тьюринга говорят, что она вычисляет данную функцию, а сама функция называется

вычислимой по Тьюрингу или вычислимой.

29

Упражнения 1. Имеется машина Тьюринга с внешним алфавитом А={а0, 1}, алфавитом внутренних состояний Q = {q0, q1} и функциональной схемой (программой).

Q

q0

q1

A \

 

 

a0

 

q01

1

 

q1

В столбце q0 ничего не написано, потому что q0 — заключительное состояние машины, т.е. такое состояние, оказавшись в котором машина останавливается. Функциональную схему или программу кратко можно записать в виде последовательности из двух команд: q1a0 q01, q11 q11П. Определите, в какое слово перерабатывает машина каждое из следующих слов, если она находится в начальном состоянии q1 и обозревает указанную ячейку:

а) 1а011a0a011 (обозревается ячейка 4, считая слева); б) 11a0111a01 (обозревается ячейка 2);

в) 1a0a0111 (обозревается ячейка 3); г) 1111a011 (обозревается ячейка 4); д) 11a01111 (обозревается ячейка 3); е) 1111111 (обозревается ячейка 4); ж) 11111 (обозревается ячейка 5);

з) 111...1 (k единиц, обозревается k-я ячейка).

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

Решение:

а) Изобразим схематически начальную конфигурацию (начальное положение машины):

q1

 

1

a0

1

1

a0

a0

1

1

 

Схема означает, что машина находится в состоянии q1 и обозревает ячейку, в которой записана буква 1, в соседней слева ячейке записана та же буква, а в соседней справа ячейке записана буква а0 (т.е. согласно нашему соглашению ничего не записано) и т.д. Ничего не записано и во всех непоказанных ячейках ленты.

30

На первом такте работы согласно команде q01 q11П машина остается в прежнем состоянии 1, в обозреваемую ячейку вписывает букву 1 (т.е. фактически оставляет уже вписанную в эту ячейку букву 1 неизменной) и переходит к обозрению следующей правой ячейки (т.е. ячейки 5). Изобразим схематически положение, в котором оказалась машина:

q1

 

1

a0

1

1

a0

a0

1

1

 

На втором такте работы согласно команде q1a0 q01машина вписывает в обозреваемую ячейку 5 букву 1, продолжает обозревать ту же ячейку и переходит в состояние q0, т. е. останавливается. Создавшаяся конфигурация имеет вид:

q0

 

1

a0

1

1

1

a0

1

1

 

Таким образом, из данного начального положения слово 1а011a0a011 перерабатывается машиной в слово 1а0111а011.

Упражнения 2. Дана машина Тьюринга с внешним алфавитом А={а0, 1}, алфавитом внутренних состояний Q = {q0, q1, q2, q3, q4, q5, q6, q7} и со следующей функциональнойсхемой (программой):

A

Q

q1

q2

q3

q4

q5

q6

q7

 

 

 

 

 

 

 

 

a0

 

q4a0П

q6a0П

q6a0П

q01

q4a0П

q0a0

q6a0П

1

 

q2

q3

q1

q5a0

q5a0

q7a0

q7a0

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

а) 11111; б) 111111; в) 1111; г) 1111111; д) 111;

е) 1a0111a0a01111;

Соседние файлы в предмете [НЕСОРТИРОВАННОЕ]