1. Вычислить сумму 1+2+3+…+N.
2. Подсчитать сумму ряда целых четных чисел от 2 до N.
3. Вычислить сумму ряда целых нечетных чисел от 1 до n.
4. Найти значение произведения: 2*4*6*...*26
5. Найти значение произведения: 1*3*5*...*11
6. Вычислить значение n-го члена ряда Фибоначчи: f(0)=0, f(1)=1,
f(n)=f(n-1)+f(n-2).
7. Используя базу данных и правило предок из примера 2 составить правило для определения всех потомков-мужчин.
8. Используя базу данных и правило предок из примера 2 составить правило для определения всех потомков-женщин.
Отчет о выполненной самостоятельной работе должен содержать:
1) тему лабораторной работы;
2) условие задачи;
3) листинг программы;
4) результаты ее тестирования.
Решение логических задач в ПРОЛОГе
ПРОЛОГ позволяет наиболее естественным образом решать логические задачи, моделируя процесс размышления человека с помощью правил.
Многие логические задачи связаны с рассмотрением нескольких конечных множеств с одинаковым количеством элементов, между которыми устанавливается взаимно-однозначное соответствие. В ПРОЛОГе эти множества можно описывать как базы данных, а зависимости между объектами устанавливать с помощью правил.
|
|
Пример 1
В автомобильных гонках три первых места заняли Алеша, Петя и Коля. Какое место занял каждый из них, если Петя занял не второе и не третье место, а Коля - не третье?
Решение
Традиционным способом задача решается заполнением таблицы. По условию задачи Петя занял не второе и не третье место, а Коля - не третье. Это позволяет поставить символ '-' в соответствующих клетках.
Имя | I место | II место | III место |
Алеша | |||
Петя | - | - | |
Коля | - |
Между множеством имен участников гонки и множеством мест должно быть установлено взаимнооднозначное соответствие. Поэтому определяем занятое место сначала у Пети, затем у Коли и, наконец, у Алеши. В соответствующих клетках проставляем знак '+'. В каждой строке и каждом столбце должен быть только один такой знак.
Имя | I место | II место | III место |
Алеша | - | - | + |
Петя | + | - | - |
Коля | - | + | - |
Из последней таблицы следует, что Алеша занял третье место, Петя - первое, Коля - второе.
Программа на ПРОЛОГе будет выглядеть следующим образом:
PREDICATES
имя(string)
место(string)
соответствие(string,string)
решение(string,string,string,string,string,string)
CLAUSES
имя(алеша).
имя(петя).
имя(коля).
место(первое).
место(второе).
место(третье).
/* Устанавливаем взаимнооднозначное соответствие
между множеством имен и множеством мест, X - имя,Y - место */
/* Петя занял не второе и не третье место */
соответствие(X, Y):-имя(X), X=петя,
место(Y),not(Y=второе),
not(Y=третье).
/* Коля занял не третье место */
|
|
соответствие(X, Y):- имя(X), X=коля,
место(Y), not(Y=третье).
соответствие(X, Y):- имя(X), X=алеша, место(Y).
/* У всех ребят разные места */
решение(X1,Y1,X2,Y2,X3,Y3):-
X1=петя,соответствие(X1,Y1),
X2=коля,соответствие(X2,Y2),
X3=алеша,соответствие(X3,Y3),
Y1<>Y2, Y2<>Y3, Y1<>Y3.
GOAL
решение(X1,Y1,X2,Y2,X3,Y3), write(X1," - ",Y1),nl,
write(X2," - ",Y2),nl,write(X3," - ",Y3),nl.
Результат выполнения программы
петя - первое
коля - второе
алеша - третье
Пример 2
Наташа, Валя и Аня вышли на прогулку, причем туфли и платье каждой были или белого, или синего, или зеленого цвета. У Наташи были зеленые туфли, а Валя не любит белый цвет. Только у Ани платье и туфли были одного цвета. Определить цвет туфель и платья каждой из девочек, если у всех туфли и платья были разного цвета.
Решение
PREDICATES
имя(string)
туфли(string)
платье(string)
соот(string,string,string)
решение(string,string,string,string,string,string,
string,string,string)
CLAUSES
имя(наташа).
имя(валя).
имя(аня).
туфли(белый).
туфли(синий).
туфли(зеленый).
платье(белый).
платье(синий).
платье(зеленый).
% X – имя, Y – цвет туфель, Z – цвет платья
соот(X,Y,Z):-имя(X),туфли(Y),платье(Z),
X=наташа,Y=зеленый,Y<>Z.
соот(X,Y,Z):-имя(X),туфли(Y),платье(Z),
X=валя,not(Y=белый),
not(Z=белый), Y<>Z.
соот(X,Y,Z):-имя(X),туфли(Y),платье(Z),X=аня,Y=Z.
решение(X1,Y1,Z1,X2,Y2,Z2,X3,Y3,Z3):-
X1=наташа,соот(X1,Y1,Z1),
X2=валя, соот(X2,Y2,Z2),
X3=аня, соот(X3,Y3,Z3),
Y1<>Y2, Y2<>Y3, Y1<>Y3,
Z1<>Z2, Z2<>Z3, Z1<>Z3.
GOAL
решение(X1,Y1,Z1,X2,Y2,Z2,X3,Y3,Z3),
write(X1," туфли- ",Y1," платье- ",Z1),nl,
write(X2," туфли- ",Y2," платье- ",Z2),nl,
write(X3," туфли- ",Y3," платье- ",Z3),nl.