Скачиваний:
37
Добавлен:
01.05.2014
Размер:
282.11 Кб
Скачать

Министерство образования Российской Федерации

Нижегородский государственный технический

университет

Кафедра “Компьютерные технологии в проектировании и производстве ”

Представление знаний в информационных системах

Лабораторная работа № 2

Выполнил:

студент гр. 02-КТ-2

Тимофеев Д.Л.

Проверил:

Волков М.Б.

Нижний Новгород

2004 г.

Управление перебором

Цель работы: ознакомиться со средствами управления перебором в логическом программировании и получить навыки разработки программ с управлением перебором на языке Visual Prolog.

Задание №1.

Дана двухступенчатая функция. Связь между Х и Y можно определить с помощью следующих трех правил:

Правило 1: если Х < 3, то Y = 0.

Правило 2: если 3 <= X и Х < 6, то Y=2.

Правило 3: если 6 <= X, то Y = 4.

Составить программу на Visual Prolog без применения отсечений, используя бинарное отношение f(X,Y). Проанализировать процедуру достижение цели: f(1,Y), 2<Y.

Программа:

PREDICATES

nondeterm f(integer,integer)

CLAUSES

f(X,0):-X<3.

f(X,2):-X>=3,X<6.

f(X,4):-X>6.

GOAL

%f(1,Y),2<Y.

%no solution

Задание №2.

Модифицировать программу из задания №1, используя зеленые отсечения в первом и втором правилах.

Программа:

PREDICATES

nondeterm f(integer,integer)

CLAUSES

f(X,0):-X<3,!.

f(X,2):-X>=3,X<6,!.

f(X,4):-X>6.

GOAL

%f(1,Y),2<Y.

%no solution

Задание №3.

Модифицировать программу из задания №1, используя красные отсечения.

Программа:

PREDICATES

nondeterm f(integer,integer)

CLAUSES

f(X,0):-X<3,!.

f(X,2):-X<6,!.

f(X,4):-X>6.

GOAL

%(1)

%f(1,Y),2<Y.

%no solution

Задание №4.

Составить программу (без применения отсечений) для определения наименьшего из двух чисел (X и Y), использовав отношение: минимум(X,Y,Z). Применить в программе зеленые и красные отсечения. Проверить выполнение цели: минимум(2,5,5).

Программа1:

PREDICATES

nondeterm min(integer,integer,integer)

CLAUSES

min(X,Y,X):-X<Y.

min(X,Y,Y):-Y<X,X=Y.

GOAL

%1

%min(2,5,N).

%N=2

%1 solution

%2

%min(2,5,5).

%no

Программа2 (с зелеными отсечениями):

PREDICATES

nondeterm min(integer,integer,integer)

CLAUSES

min(X,Y,X):-X<Y;X=Y,!.

min(X,Y,Y):-Y<X;X=Y.

GOAL

%1

%min(2,5,N).

%N=2

%1 solution

%2

%min(2,5,5).

%no

Программа2 (с красными отсечениями):

PREDICATES

nondeterm min(integer,integer,integer)

CLAUSES

min(X,Y,X):-X<Y;X=Y,!.

min(X,Y,Y):-Y<X.

GOAL

%1

%min(2,5,N).

%N=2

%1 solution

%2

%min(2,5,5).

%no

Задание №5.

Программа:

PREDICATES

nondeterm p(integer)

CLAUSES

p(1).

p(2):-!.

p(3).

GOAL

%p(X).

%X=1

%X=2

%2 solutions

%p(X),p(Y).

%X=1 Y=1

%X=1 Y=2

%X=2 Y=1

%X=2 Y=2

%4 solutions

%p(X),!,p(Y).

%X=1 Y=1

%X=1 Y=2

Выводы:

  • При применении отсечений в базе фактов и правил учитывается порядок правил, а также наличие избыточных условий.

  • При применении отсечений в GOAL для подцелей, стоящих слева от отсечения, отыскивается только первое решение.

Списки

Цель работы:

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

.

Задание 3.1

Используя отношение конкатенация, напишите цель, соответствующую вычеркиванию трех последних элементов списка L. Результат - новый список L1.

DOMAINS

список=symbol*.

PREDICATES

%конк(входной_список_1,входной_список_2, список_результат)

nondeterm конк(список, список, список)

CLAUSES

%Конкатенация двух списков L1 и L2, на выходе список L3

конк( [ ], L, L ).

конк([X|L1],L2,[X|L3]):-конк(L1,L2,L3).

GOAL

L = [a, b, z, z, c, z, z, z, d, e],конк(L1,[_,_,_],L).

%результат выполнения

L=["a","b","z","z","c","z","z","z","d","e"], L1=["a","b","z","z","c","z","z"]

1 Solution

Задание 3.2

Напишите последовательность целей для порождения списка L2,

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

цель

Используем программу из Задания 3.1, заменяя в ней цуль поиска

GOAL

L = [a,b,z,z ,c,z,z,z,d,e],конк([_,_,_],L1,L),конк(L2,[_,_,_],L1).

%результат выполнения

L=["a","b","z","z","c","z","z","z","d","e"], L1=["z","c","z","z","z","d","e"], L2=["z","c","z","z"]

1 Solution

Задание 3.3

Определите отношение, последний( Элемент, Список)

так, чтобы Элемент являлся последним элементом списка Список. Напишите два варианта определения:

  • с использованием отношения конк,

  • без использования этого отношения.

DOMAINS

список=symbol*

PREDICATES

%последний(Перременная_возвращающая_элемент, Список)

%с использованием конк

nondeterm последний1(symbol, список)

%без использования конк

nondeterm последний2(symbol, список)

CLAUSES

%последний элемент

%с использованием конкатенации

последний1(Элемент, Список):-конк(_,[Элемент],Список).

%без использования конкатенации

последний2(Элемент, [Элемент]).

последний2(Элемент, [_| Остальные]):-

последний2(Элемент,Остальные).

GOAL

%цель

L=[a,b,z,z,c,z,z,z,d,e],последний1(Последний,L).

%результат выполнения

L=["a","b","z","z","c","z","z","z","d","e"], Последний=e

1 Solution

%цель

L=[a,b,z,z,c,z,z,z,d,e],последний2(Последний,L).

%результат выполнения

L=["a","b","z","z","c","z","z","z","d","e"], Последний=e

1 Solution

Задание 3.4

Определите два предиката, четнаядлина( Список) и нечетнаядлина( Список)

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

DOMAINS

список=symbol*

PREDICATES

%чет/нечет

nondeterm четнаядлина(список)

nondeterm нечетнаядлина(список)

CLAUSES

%Определение чётности и нечётности длинны списка - Задание 3.4

четнаядлина([]).

четнаядлина( [_| Остальные]):-нечетнаядлина( Остальные).

нечетнаядлина( [_] ).

нечетнаядлина( [_|Остальные]):-четнаядлина( Остальные).

GOAL

%цель

нечетнаядлина([a]).

%результат выполнения

yes

%цель

нечетнаядлина([a]).

%результат выполнения

no

%цель

нечетнаядлина([a,b,c,d]).

%результат выполнения

no

%цель

четнаядлина([a,b,c,d]).

%результат выполнения

yes

Задание 3.5

Определите отношение, обращение( Список, ОбращенныйСписок),которое обращает списки.

DOMAINS

список=symbol*

PREDICATES

%обращение(первоначальный_список, инвертированный_список)

nondeterm обращение(список,список)

CLAUSES

%инвертирование списка - Задание 3.5

обращение( [], []).

обращение( [Первый|Остальные], ОбращСпис):-

обращение(Остальные,ОбращСписОстальных),

конк(ОбращСписОстальных, [Первый], ОбращСпис).

GOAL

%цель

обращение([a,b,c,d],New).

%результат выполнения

New=["d","c","b","a"]

1 Solution

Задание 3.6

Определите предикат: палиндром( Список)., Список называется палиндромом, если он читаемся одинаково, как слева направо, так и справа налево.

DOMAINS

список=symbol*

PREDICATES

%палиндром(список)

nondeterm палиндром(список)

CLAUSES

палиндром( [] ).

палиндром( [_] ).

палиндром ([Первый|Остальные] ) :-

конк( Середина,[Первый],Остальные),

палиндром( Середина).

GOAL

%цель

палиндром([a,b,a]).

%результат выполнения

yes

Задание 3.7

Определите отношение, сдвиг( Список1, Список2), таким образом, чтобы Список2 представлял собой Список1, «циклически сдвинутый» влево на один символ.

DOMAINS

список=symbol*

PREDICATES

%сдвиг(начальный_список, список_со_сдвигом)

nondeterm сдвиг(список, список)

CLAUSES

%Циклический сдвиг влево

сдвиг( [Первый|Остальные], Сдвинут) :-

конк(Остальные,[Первый], Сдвинут).

GOAL

%цель

сдвиг( [a,b,c,d,e] ,L1), сдвиг(L1,L2).

%результат выполнения

%L1=["b","c","d","e","a"], L2=["c","d","e","a","b"]

%1 Solution

Задание 3.8

Определите отношение: перевод( Список1, Список2), для перевода списка чисел от 0 до 9 в список соответствующих слов.

DOMAINS

список=symbol*

числ_список=integer*

PREDICATES

%Перевод из числа в слово

nondeterm означает(integer, symbol).

nondeterm перевод(числ_список, список).

CLAUSES

%Перевод списка чисел, в список слов %составим базу фактов "означает"

означает(0,ноль).

означает(1,один).

означает(2,два).

означает(3,три).

означает(4,четыре).

означает(5,пять).

означает(6,шесть).

означает(7,семь).

означает(8,восемь).

означает(9,девять).

%правило переводящее числовой списоу в символьный

перевод([],[]).

перевод([Голова|Хвост],[Голова_др|Хвост_др]):-

означает(Голова, Голова_др), перевод(Хвост, Хвост_др).

GOAL

%цель

перевод([1,2,3], Первод).

%результат выполнения

Первод=["один","два","три"]

%цель

перевод(Первод,[ноль,шесть,четыре]).

%результат выполнения

Первод=[0,6,4]