Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Prolog.doc
Скачиваний:
31
Добавлен:
12.03.2015
Размер:
929.28 Кб
Скачать

Целевое утверждение

уничт_список(Дуги,дуга(Д,Вид), Дуги2)

уничтожает дугу дуга(Д,Вид) в списке Дуги, в результате чего пол­учается список Дуги2. Предикат уничт_список импортируется из модуля список.

Добавляя дугу, следует проверить, не содержится ли она уже в списке дуг:

доб_дугу(Вид,Д) :-

верш (Вид,В,Дуги),

принадлежит (Д,Дуги),!,

nl, write ('уже существует !!'),nl.

доб_дугу(Вид,дуга(Д,Вид2)) :-

верш (Вид2,_,_),

retract (верш (Вид, В, Дуги)),

assertz(верш(Вид,В,[дуга(Д,Вид2) | Дуги])),

nl,write ('дуга добавлена'),nl.

Утверждение уничт_дугу позволяет уничтожить дугу Д, выходя­щую из вершины с идентификатором Вид:

уничт_дугу (Вид, Д) : -

retract (верш(Вид, В, Дуги)),

уничт_список(Дуги,Д,Дуги2),

assertz (верш (Вид, В, Дуги2)),

nl,write(yra уничтожена') ,nl.

Будем говорить, что вершина Вид1 ведет к вершине Вид2, если имеет место одна из следующих трех ситуаций: Вид2 есть Вид1, Вид2 находится в конце дуги, выходящей из Вид1, или же верши­на, находящаяся в конце дуги, выходящей из Вид1, ведет к Вид2. Доказательство целевого утверждения ведет заканчивается успе­хом, если существует путь, ведущий от дуги (первого аргумента утверждения) к вершине (второму аргументу). В противном случае доказательство завершается неудачей. При успешном доказатель­стве утверждения ведет в качестве третьего аргумента возвращает­ся искомый путь.

ведет ([дуга(Д,Вид) | T],Вид2,II) :-

вести (Вид, Вид2,П),!.

ведет([_| Т],Вид2,П) :- ведет (Т,Вид2,П).

вести(Вид,Вид,[Вид,Вид]) :- !.

вести(Вид1,Вид2,[Вид1,Вид2]) :-

верш (Вид1,В,Дуги),

принадлежит (дуга (Д,Вид2),Дуги),!.

вести (Вид1,Вид2,[Вид1 | П]) :-

верш (Вид1,В,Дуги),

ведет(Дуги,Вид2,П),

Для того чтобы пройти по дереву, начиная с вершины СВид, нужно вывести на экран вопрос, содержащийся в вершине. Если вер­шина не имеет исходящих дуг, работа заканчивается. В противном случае система читает ответ пользователя и использует предикат принадлежит для выборки следующей вершины.

обход(СВид) :-

верш (СВид,В,Дуги),

обраб_дуги(Дуги,В).

обраб_дуги([] ,В) :- !,

писать_вопрос(В).

обраб_дуги(Дуги,В) :-

ввести_ответ(В,Дуги,Отв),

принадлежит(дуга(Отв,Вид),Дуги),

обход (Вид).

Ответ пользователя на вопрос, содержащийся в вершине, вводит­ся с помощью следующего утверждения:

ввести_ответ(В,Дуги,Отв) :-

repeat,

писать_вопрос(В),

геаdb(Отв),

принадлежит(дуга(Отв,_),Дуги),!.

Предикат ввести_ответ гарантирует совпадение ответа пользова­теля хотя бы с одним ответом, расположенным на дуге.

Последнее, что нам осталось сделать, - это осуществить импорт предиката уничт_список из модуля список:

;- import(список, [уничт_список]).

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

:- module (список).

:-visa([visa,secure], [присоединить,...,

уничт_список,...])

уничт_список([] ,Е,[]) :-!.

уничт_список([Е | 'I'] ,E,T2) ;- !,

уничт_список (Т,E,T2).

уничт_список([H | T),E,[H | T2]) :-,

уничт_список(Т,Е,Т2).

:- endmodule(список).

Пример диалога. В заключение приведем пример типичного диа­лога пользователя с разработанной системой. Мы построим дерево, изображенное на рис. 10.2.1. и обойдем его в поисках решения.

ОК, дерево Пролога

?- меню.

Хотите ли вы:

1) загрузить дерево

2) сохранить дерево

3) добавить вершину

4) убрать вершину

5) добавить дугу

6) убрать дугу

7) посмотреть дерево

8) совершить обход дерева

9) выйти из системы

Введите 1-9 ? 3

Идентификатор новой вершины ? IВМ_портативная

Введите вопрос (в конце напишите слово 'конец'):

> > Вы должны купить портативную ЭВМ фирмы IBM.

> > Она стоит 1632 фунта стерлингов,

> > использует процессор 8088, имеет 256К

> > оперативной памяти

> >

> > конец

Сколько дуг имеет вершина ? 0 Хотите ли вы:

1) загрузить дерево

2) сохранить дерево

3) добавить вершину

4) убрать вершину

5) добавить дугу

6) убрать дугу

7) посмотреть дерево

8) совершить обход дерева

9) выйти из системы

Введите 1 - 9 ? 3

Идентификатор новой вершины ? sharp_pc7000

Введите вопрос (В конце напишите слово 'конец'):

> > Вы должны купить портативную ЭВМ фирмы

> > sharp_pc7000

> > Она стоит 2577 фунтов стерлингов,

> > использует процессор 8088, имеет 320К

> > оперативной памяти

> >

> > конец

Сколько дуг имеет вершина ? 0

Хотите ли вы:

1) загрузить дерево

2) сохранить дерево

3) добавить вершину

4) убрать вершину

5) добавить дугу

6) убрать дугу

7) посмотреть дерево

8) совершить обход дерева

9) выйти из системы

Введите 1 – 9 ? 3

Идентификатор новой вершины ? цена

Введите вопрос (В конце напишите слово 'конец'):

> > Сколько денег вы можете затратить на

> > покупку:

> > а. 2000 фунтов стерлингов

> > б. 3000 фунтов стерлингов

> > ?

> > конец

Сколько дуг имеет вершина? 2

Дуга 1

Ответ ? а

К вершине IВМ_портативная

Дуга 2

Ответ ? 6

К вершине ? sharp_pc7000

Хотите ли вы:

1) загрузить дерево

2) сохранить дерево

3) добавить вершину

4) убрать вершину

5) добавить дугу

6) убрать дугу

7) посмотреть дерево

8) совершить обход дерева

9) выйти из системы

Введите 1 – 9 ? 3

Идентификатор новой вершины ? карманная

Введите вопрос (В конце напишите слово 'конец'):

> > Должна ли ЭВМ помещаться в вашем кармане ?

> > конец

Сколько дуг имеет вершина ? 1

Дуга 1

Ответ ? нет

К вершине ? цена

Хотите ли вы:

1)загрузить дерево

2) сохранить дерево

3) добавить вершину

4) убрать вершину

5) добавить дугу

6) убрать лугу

7) посмотреть дерево

8) совершить обход дерева

9) выйти из системы

Введите 1 – 9 ? 7

Идентификатор вершины ? карманная

Показ дерева

??

[карманная]

нет

[цена]

б

[sharp_pc7000]

a

[IВМ_портативная]

Хотите ли вы:

1) загрузить дерево

2) сохранить дерево

3) добавить вершину

4) убрать вершину

5)добавить дугу

6) убрать дугу

7) посмотреть дерево

8) совершить обход дерева

9) выйти из системы

Введите 1 - 9 ? 3

Идентификатор новой вершины ? IВМ_совместимая

Введите вопрос (В конце напишите слово 'конец'):

> > Должна ли ЭВМ быть IBM - совместимой ?

> > конец

Сколько дуг имеет вершина? 0

Хотите ли вы

1)загрузить дерево

2) сохранить дерево

3) добавить вершину

4) убрать вершину

5) добавить дугу

6) убрать дугу

7) посмотреть дерево

8) совершить обход дерева

9) выйти из системы

Введите 1 – 9 ? 3

Идентификатор новой вершины ? портативная

Введите вопрос (В конце напишите слово 'кон칇ц'):

> > Должна ли ЭВМ быть портативной ?

> > конец

Сколько дуг имеет вершина ? 2

Дуга 1

Ответ ? да

К вершине ? карманная

Дуга 2

Ответ ? нет

К вершине ? IВМ_совместимая

Хотите ли вы:

1) загрузить дерево

2) сохранить дерево

3) добавить вершину

4) убрать вершину

5) добавить дугу

6) убрать дугу

7) посмотреть дерево

8) совершить обход дерева

9) выйти из системы

Введите 1 - 9 ? 7

Идентификатор вершины ? портативная

Показ дерева

??

[портативная]

нет

[IВМ_совместимая]

да

[карманная]

нет

[цена]

б

[sharp_pc7000]

a

[IВМ_портативная]

Хотите ли вы:

1) загрузить дерево

2) сохранить дерево

3) добавить вершину

4) убрать вершину

5) добавить дугу

6) убрать дугу

7) посмотреть дерево

8) совершить обход дерева

9) выйти из системы

Введите 1 - 9 ? 8

Идентификатор вершины ? портативная

Должна ли ЭВМ быть портативной ? да

Должна ли ЭВМ помещаться в вашем кармане? Нет

Сколько денег вы можете затратить на покупку:

а. 2000 фунтов стерлингов

б. 3000 фунтов стерлингов

? а

Вы должны купить портативную ЭВМ фирмы IBM,

Она стоит 1632 фунта стерлингов, использует

процессор 8088, имеет 256К оперативной памяти.

Хотите ли вы:

1) загрузить дерево

2) сохранить дерево

3) добавить вершину

4) убрать вершину

5) добавить дугу

6) убрать дугу

7) посмотреть дерево

8) совершить обход дерева

9) выйти из системы

Введите 1-9 ? 9

До свидания

да

?- q /* выход из системы Пролог */

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