2. Проверка структуры на конфигурацию «отрезок

advertisement
Министерство образования и науки РФ
Федеральное государственное бюджетное образовательное учреждение
высшего профессионального образования
Самарский государственный архитектурно-строительный университет
Факультет информационных систем и технологий
Кафедра прикладной математики и вычислительной техники
Практикум на языке Пролог
Прохорова О.В.
01.01.2014
В учебном пособии дается решение практических задач на языке
Пролог с комментариями основных действий
Оглавление
1.
Работа со структурами, 1 и 2-й уровни понимания .................................................. 3
2.
Проверка структуры на конфигурацию «отрезок» ................................................... 5
3.
Проверка 1 структуры на конфигурацию «прямоугольный треугольник». ............. 6
4.
Проверка 2 структуры на конфигурацию «прямоугольный треугольник». ............. 7
5.
Проверка структуры на конфигурацию «прямоугольник» ..................................... 9
6.
Проверка структуры на конфигурацию «прямая линия» ...................................... 10
7.
Проверка сидит ли один человек рядом с другим или нет ..................................... 11
8.
Проверка занятости конкретного человека ............................................................ 12
9.
Вычисление чисел ряда Фибоначчи ...................................................................... 14
10.
Вычисление факториала рекурсивно..................................................................... 15
11.
Набор рабочих программ ...................................................................................... 17
2
1. Работа со структурами, 1 и 2-й уровни понимания
parent(pam, bob).
parent(tom, bob).
parent(tom, liz).
parent(bob, ann).
parent(bob, pat).
parent(mary, ann).
parent(pat, juli).
birthday(pam,date(21,april,1990)).
birthday(bob,date(22,april,1990)).
birthday(tom,date(23,april,1990)).
birthday(mary,date(24,april,1990)).
male(tom).
male(bob).
male(jim).
female(liz).
female(pam).
female(pat).
female(ann).
female(mary).
female(juli).
child(X, Y) :- parent(Y, X).
mother(X, Y) :- parent(X, Y), female(X).
3
different(X, Y) :- not(X=Y).
sister(X, Y) :- parent(Z, X), parent(Z, Y), female(X), different(X, Y).
grandmother(H, X) :- parent(Y, X), parent(H, Y), female(H).
getday(X,Y) :- birthday(X,date(Y,_,_)).
4
2. Проверка структуры на конфигурацию «отрезок»
point(p1,coord(0,0)).
point(p2,coord(22,22)).
point(p3,coord(0,22)).
point(p4,coord(22,0)).
point(p5,coord(32,22)).
point(p6,coord(0,22)).
point(p7,coord(32,0)).
point(p8,coord(22,2)).
point(p9,coord(2,22)).
segment(X1,Y1,X2,Y2):point(P1,coord(X1,Y1)),point(P2,coord(X2,Y2)),P1 \= P2.
5
3. Проверка 1 структуры на конфигурацию «прямоугольный
треугольник».
Вариант 1.
point(p1,coord(0,0)).
point(p2,coord(22,22)).
point(p3,coord(0,22)).
point(p4,coord(22,0)).
point(p5,coord(32,22)).
point(p6,coord(0,22)).
point(p7,coord(32,0)).
point(p8,coord(22,2)).
point(p9,coord(2,22)).
leng(X1,Y1,X2,Y2,Z):- Z is(X1-X2)*(X1-X2)+(Y1-Y2)*(Y1-Y2).
right_triangle(X1,Y1,X2,Y2,X3,Y3) :- point(P1,coord(X1,Y1)),
point(P2,coord(X2,Y2)), point(P3,coord(X3,Y3)), P1 \= P2, P1 \= P3,
P2 \= P3, leng(X1,Y1,X2,Y2,Z1), leng(X1,Y1,X3,Y3,Z2), P is Z1+Z2 ,
leng(X3,Y3,X2,Y2,Z3), P=Z3.
6
4. Проверка 2 структуры на конфигурацию «прямоугольный
треугольник».
% Проверить является ли треугольник прямоугольным.
% Пользователь вводит три координаты.
%hypo(L1, L2, L2, H) :- H is
line(X1, Y1, X2, Y2, L) :- L is (((X1-X2)*(X1-X2))+((Y1-Y2)*(Y1Y2))).
max(X, Y, X) :- X >= Y.
max(X, Y, Y) :- X < Y.
min(X, Y, X) :- X < Y.
min(X, Y, Y) :- X >= Y.
minlist([X], X).
minlist([X, Y|Rest], Min) :- minlist([Y|Rest], MinRest), min(X,
MinRest, Min).
maxlist([X], X).
maxlist([X, Y|Rest], Max) :- maxlist([Y|Rest], MaxRest), max(X,
MaxRest, Max).
minmax(L, Min, Max) :- minlist(L, Min), maxlist(L, Max).
sq_triangle(X1, Y1, X2, Y2, X3, Y3) :line(X1, Y1, X2, Y2, L1),
7
line(X1, Y1, X3, Y3, L2),
line(X3, Y3, X2, Y2, L3),
minmax([L1, L2], Min, Max),
minmax([Max, L3], Min2, Max),
R is Min+Min2,
Max = R.
% Test
% ?- sq_triangle(0,4,5,0,0,0).
% true.
% ?- sq_triangle(0,4,5,0,0,8).
% false.
8
5. Проверка структуры на конфигурацию «прямоугольник»
point(p1,coord(0,0)).
point(p2,coord(22,22)).
point(p3,coord(0,22)).
point(p4,coord(22,0)).
point(p5,coord(32,22)).
point(p6,coord(0,22)).
point(p7,coord(32,0)).
point(p8,coord(22,2)).
point(p9,coord(2,22)).
leng(X1,Y1,X2,Y2,Z):- Z is(X1-X2)*(X1-X2)+(Y1-Y2)*(Y1-Y2).
sqr(P1,P2,P3,P4,Z1,Z2,Z3,Z4) :point(P1,coord(X1,Y1)),point(P2,coord(X2,Y2)),
point(P3,coord(X3,Y3)),point(P4,coord(X4,Y4)),
leng(X1,Y1,X3,Y3,Z1),
leng(X2,Y2,X4,Y4,Z2),Z1=Z2,P1\=P2,P1\=P3,P1\=P4,P2\=P3,P2\
= P4,P3\=P4,
leng(X1,Y1,X2,Y2,Z3),leng(X3,Y3,X4,Y4,Z4),Z3=Z4.
9
6. Проверка структуры на конфигурацию «прямая линия»
point(5,6).
point(5,8).
koeff(5).
koeff(8).
len(15).
line(K, X, Y) :- koeff(K), point(X,Y).
quad(X, Y, L) :- point(X, Y), len(L).
point(4,2).
point(5,1).
point(3,8)
10
7. Проверка сидит ли один человек рядом с другим или нет
% Рассадка в класса.
% Нужно определить сидит ли один человек рядом с другим или нет.
% В классе восемь человек, сидят вот так:
% xx xx
% xx xx
% (ann, petr) (july, ivan)
% (belle, mike) (kate, jonh)
% база данных
row(1, ann).
row(1, belle).
row(2, petr).
row(2, mike).
row(3, july).
row(3, kate).
row(4, ivan).
row(4, jonh).
seat(X, Y) :- row(One, X), row(Two, Y), R is One-Two, (R = 0 ; R = 1 ; R = -1).
% Тест
% ?- seat(kate, belle).
% false.
% ?- seat(kate, jonh).
% true.
% ?- seat(kate, july).
% true .
11
8. Проверка занятости конкретного человека
% первый параметр — время дня, второй — человек, третий, что
он должен делать.
time(one, ivan, asleep).
time(two, ivan, asleep).
time(three, ivan, asleep).
time(three, anton, walking).
time(four, ivan, asleep).
time(five, ivan, asleep).
time(six, ivan, asleep).
time(seven, ivan, wake_up).
time(eight, ivan, have_dinner).
time(nine, ivan, go_to_work).
time(ten, ivan, working).
time(eleven, ivan, working).
time(twelve, ivan, watching_tv).
% Тест
% ?- time(Time, ivan, Doing).
% Time = one,
% Doing = asleep ;
% Time = two,
% Doing = asleep ;
12
% Time = three,
% Doing = asleep;
% и так далее...
( insert_list '(a b c) 'z)
13
9. Вычисление чисел ряда Фибоначчи
fib(B,A,N,S):- D is A+B, % новое число Фибоначчи
T is A, % новое предпредыдущее число
G is D, % новое предыдущее число
K is S+1, % счетчик чисел
K=<N,
fib(T,G,N,K);
write(' N - number of fibbonachi row is '),
write(A).
% N – номер искомого числа в ряде Фибоначчи
% B – предпредыдущее число
% A – предыдущее число
% S – счетчик чисел
Тестирование.
?- fib(1,1,8,2).
N - number of fibbonachi row is 21
true
14
10. Вычисление факториала рекурсивно
Вариант 1.
factorial(X):-f(X,Y),write(Y).
f(1,1):-!.
f(X,Y):-X>1,X1 is X-1,f(X1,Y1),Y is Y1*X.
Вопрос
?- factorial(5)
Ответ системы пролог:
120
true
Вариант 2.
Автор Досов Я.
Вопрос
?- fac(5,1,1).
15
Ответ системы пролог
2!= 2
3!= 6
4!= 24
5!= 120
Вариант 3. Автор Никерова В.
fact(0,1):-!.
fact(N,F):-N1 is N-1,write(N),write(' '),
fact(N1,F1),
F is F1*N.
Тестирование.
?- fact(5,R).
54321
R = 120.
?- fact(0,R).
R = 1.
?- fact(2,R).
21
R = 2.
16
11. Набор рабочих программ
% кто ? -темный(Х),большой(Х). %
большой(медведь).
большой(слон).
маленький(кот).
коричневый(медведь).
черный(кот).
серый(слон).
темный(Z):- коричневый(Z).
темный(Z):- черный(Z).
% ввести список, вывести список ?-pr.
pr:-write('Введите список L:'),nl, read(L),nl, write('Список L='),
tab(2), write(L),nl.
% проверка бэктрекинга ?- cut_test_a(X),nl,write(X).
data(one).
data(two).
data(three).
cut_test_b(X):- data(X),!, cut_test_b('last clouse').
cut_test_c(X,Y):- data(X),!, data(Y).
cut_test_c('last clouse').
17
% работа с функцией, отсекая ненужные ветви поиска ?-f(1,Y),Y>2.
f( X, 0):-X<3, !.
f(X, 2):- 3=<X, X<6, !.
f(X, 4):-6 =<X, !.
% определение минимального числа ?- minimum(3, 7, X)
minimum(X, Y, X):- X=<Y, ! .
% ввод-вывод списка ?-read_list(L), nl, write ('Список='), write_list(L).
read_list([X|T]):write ('Введите элемент, ставьте точку после элемента'), read(X),
X\=end, read_list(T).
write_list([H|T]):-write(H), tab(2), write_list(T).
18
Download