Министерство образования Российской Федерации
Нижегородский государственный технический
университет
Кафедра “Компьютерные технологии в проектировании и производстве ”
Представление знаний в информационных системах
Лабораторная работа № 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]