Лабораторная работа. Оператор отсечения в Прологе v9

Содержание

Слайд 2

Последовательное выполнение действий

predicates
vowel(char)
clauses
vowel('a').
vowel('e').
vowel('i').
vowel('o').
vowel('u').
vowel('y').
goal
write("Enter character:

Последовательное выполнение действий predicates vowel(char) clauses vowel('a'). vowel('e'). vowel('i'). vowel('o'). vowel('u'). vowel('y').
"), readchar(X), write(X), nl, vowel(X), write(" is vowel"), nl.

Слайд 3

Проверка одновременного выполнения двух условий

predicates
is_digit(char)
clauses
is_digit(C):- C>='0', C<='9'.
goal
readchar(X), write(X), nl,

Проверка одновременного выполнения двух условий predicates is_digit(char) clauses is_digit(C):- C>='0', C goal
is_digit(X), write(" is digit"), nl.

и

Слайд 4

Проверка выполнения хотя бы одного условия из нескольких

predicates
nondeterm not_digit(char)
clauses
not_digit(C):- C<'0'.

Проверка выполнения хотя бы одного условия из нескольких predicates nondeterm not_digit(char) clauses
not_digit(C):- C>'9'.
goal
readchar(X), write(X), nl, not_digit(X), write(" not digit"), nl.

или

Слайд 5

Возврат данных из предиката

predicates
increment(integer, integer)
clauses
increment(X, Y):- Y = X +

Возврат данных из предиката predicates increment(integer, integer) clauses increment(X, Y):- Y =
1.
goal
increment(10, Res).
1 Решение: Res = 11

Слайд 6

Неверная реализация

predicates
increment(integer)
clauses
increment(X):- X = X + 1.
goal
increment(10).
Нет решений

Неверная реализация predicates increment(integer) clauses increment(X):- X = X + 1. goal increment(10). Нет решений

Слайд 7

Если …, то …

predicates
sgn(integer, integer)
clauses
sgn(X, Result):- X>0, Result=1.
sgn(X, Result):-

Если …, то … predicates sgn(integer, integer) clauses sgn(X, Result):- X>0, Result=1.
X<0, Result=-1.
sgn(X, Result):- X=0, Result=0.
goal
sgn(-15, Res).
1 Решение: Res = -1

если

то

Слайд 8

Если …, то …, иначе …

predicates
min(integer, integer, integer)
clauses
min(X, Y, Z):-

Если …, то …, иначе … predicates min(integer, integer, integer) clauses min(X,
X min(X, Y, Z):- Z=Y.
goal
min(1, 5, Res).
1 Решение: Res = 1
Без использования отсечения
2 Решения: Res = 1 и Res = 5.

Слайд 9

Если …, то …, иначе …

predicates
min(integer, integer, integer)
clauses
min(X, Y, Z):-

Если …, то …, иначе … predicates min(integer, integer, integer) clauses min(X,
X min(X, Y, Z):- Z=Y.
goal
min(1, 5, Res).
1 Решение: Res = 1
Без использования отсечения
2 Решения: Res = 1 и Res = 5.

если

то

иначе

Слайд 10

Вызов предиката из другого предиката для проверки условия

predicates
is_digit(char)
nondeterm analyze(char)
clauses
is_digit(A):-

Вызов предиката из другого предиката для проверки условия predicates is_digit(char) nondeterm analyze(char)
A>='0', A<='9'.
analyze(B):- is_digit(B), write(" is digit"), nl, !.
analyze(B):- write(" is not digit"), nl.
goal
write("Enter character: "), readchar(X), write(X), analyze(X).

Слайд 11

Вызов предиката из другого предиката для выполнения расчета

predicates
distance(real,real,real,real,real)
in_circle(real,real,real,real,real)
clauses
distance(X1,Y1,X2,Y2,D):- DX

Вызов предиката из другого предиката для выполнения расчета predicates distance(real,real,real,real,real) in_circle(real,real,real,real,real) clauses
= X2 - X1, DY = Y2 - Y1,
D = sqrt(DX*DX + DY*DY).
in_circle(X, Y, XC, YC, R):- distance(X, Y, XC, YC, D), D<=R.
goal
in_circle(1,1,5,5,10).
Ответ: yes

Слайд 12

Последовательные вычисления

predicates
absolute(integer, integer)
min(integer, integer, integer)
calculate(integer, integer) /* calculate(X, Y)

Последовательные вычисления predicates absolute(integer, integer) min(integer, integer, integer) calculate(integer, integer) /* calculate(X,
вычисляет Y = min(|X|, 3) */
clauses
absolute(X, Y):- X < 0, Y = -X, !.
absolute(X, Y):- Y = X.
min(X, Y, Z):- X < Y, Z = X, !.
min(X, Y, Z):- Z = Y.
calculate(X, Res):- absolute(X, Xabs), min(Xabs, 3, Y), Res = Y.
goal
calculate(10, Res).
Решение Res = 3

Слайд 13

Последовательные вычисления

predicates
absolute(integer, integer)
min(integer, integer, integer)
calculate(integer, integer) /* calculate(X, Y)

Последовательные вычисления predicates absolute(integer, integer) min(integer, integer, integer) calculate(integer, integer) /* calculate(X,
вычисляет Y = min(|X|, 3) */
clauses
absolute(X, Y):- X < 0, Y = -X, !.
absolute(X, X).
min(X, Y, Z):- X < Y, Z = X, !.
min(X, Y, Y).
calculate(X, Y):- absolute(X, Xabs), min(Xabs, 3, Y).
goal
calculate(10, Res).
Решение Res = 3

Слайд 14

Последовательные вычисления

predicates
absolute(integer, integer)
min(integer, integer, integer)
calculate(integer, integer) /* calculate(X, Y)

Последовательные вычисления predicates absolute(integer, integer) min(integer, integer, integer) calculate(integer, integer) /* calculate(X,
вычисляет Y = min(|X|, 3) */
clauses
absolute(X, Y):- X < 0, Y = -X, !.
absolute(X, Y):- Y = X.
min(X, Y, Z):- X < Y, Z = X, !.
min(X, Y, Z):- Z = Y.
calculate(X, Res):- absolute(X, Xabs), min(Xabs, 3, Y), Res = Y.
goal
calculate(10, Res).

Это разные переменные!

Слайд 15

Реализация цикла через автоматический перебор вариантов

predicates
mass(real)
compose_mass(real, real, real)
clauses
mass(0.5).
mass(1.0).

Реализация цикла через автоматический перебор вариантов predicates mass(real) compose_mass(real, real, real) clauses
mass(2.0).
mass(1.5).
compose_mass(MSum, M1, M2):- mass(M1), mass(M2), MSum = M1 + M2.
goal
compose_mass(3.0, M1, M2).
3 Решения: M1 = 1.0, M2 = 2.0 M1 = 2.0, M2 = 1.0 M1 = 1.5, M2 = 1.5

Слайд 16

Расчет длины списка (рекурсия)

domains
list = integer*
predicates
length_of(list, integer) /* 1st param

Расчет длины списка (рекурсия) domains list = integer* predicates length_of(list, integer) /*
– input, 2nd param – output */
clauses
length_of([], L):- L = 0. /* условие окончания рекурсии */
length_of([H|T], L):- length_of(T, TailLength), L = TailLength + 1.
goal
length_of([1,2,3], L).

Слайд 17

Прямой проход рекурсии

Здесь стрелка показывает направление рекурсивного вывода четырех подцелей, в результате

Прямой проход рекурсии Здесь стрелка показывает направление рекурсивного вывода четырех подцелей, в
чего подцель length_of([],0) была найдена.

length_of([1,2,3],L) :-
length_of([2,3],TailLength),
L=TailLength+1.
length_of([2,3],L) :-
length_of([3],TailLength), L=TailLength+1.
length_of([3],L) :-
length_of([],TailLength), L=TailLength+1.
length_of([],0).

Слайд 18

Обратный проход рекурсии

Здесь стрелка показывает возврат назад к предыдущим подцелям от найденной

Обратный проход рекурсии Здесь стрелка показывает возврат назад к предыдущим подцелям от
подцели length_of([],0).
В процессе возврата на каждом шаге вычисляется значение L длины списка.
В результате вычисляется длина L=3.
Ответ: Yes, L=3.

length_of([1,2,3],L=3):-
length_of([2,3],TailLength=2), L=TailLength+1=3.
length_of([2,3],L=2):-
length_of([3],TailLength=1), L=TailLength+1 =2.
length_of([3],L=1):-
length_of([],TailLength=0), L=TailLength+1=1.
length_of([],0).

Слайд 27

Неверная реализация (1)

domains
list = integer*
predicates
length_of(list, integer) /* 1st param –

Неверная реализация (1) domains list = integer* predicates length_of(list, integer) /* 1st
input, 2nd param – output */
clauses
length_of([], L):- L = 0.
length_of([H|T], L):- length_of(T, TailLength), L = TailLength + 1.
goal
length_of([1,2,3],L).
Нет решений

Слайд 28

Неверная реализация (2)

domains
list = integer*
predicates
length_of(list, integer) /* 1st param –

Неверная реализация (2) domains list = integer* predicates length_of(list, integer) /* 1st
input, 2nd param – output */
clauses
length_of([], L):- L = 0.
length_of([H|T], L):- L = TailLength + 1, length_of(T, TailLength).
goal
length_of([1,2,3],L).
Ошибка: Free variable in expression

Слайд 29

Подсчет количества вхождений элемента в список

domains
list=integer*
predicates
count(integer, list, integer) % element,

Подсчет количества вхождений элемента в список domains list=integer* predicates count(integer, list, integer)
spisok, kolichestvo vhozhdenii
clauses
count(X,[H|Tail],N):- X=H, count(X,Tail,Nt), N=Nt+1.
count(X,[H|Tail],N):- X<>H, count(X,Tail,Nt), N=Nt.
count(X, [], N):- N=0.
goal
count(5, [5,1,5], Res).
Решение: Res = 2

Слайд 30

Составление списка целых чисел

domains
list=integer*
predicates
compose(integer, integer, list) % pervyi element, poslednii

Составление списка целых чисел domains list=integer* predicates compose(integer, integer, list) % pervyi
element, spisok
clauses
compose(Ns, Ne, List):- Ns > Ne, List = [].
compose(Ns, Ne, List):- Ns = Ne, List = [Ns].
compose(Ns, Ne, [H|Tail]):- Ns < Ne, H=Ns, Ns1 = Ns + 1, compose(Ns1, Ne, Tail).
goal
compose(1, 5, Res).
Решение: Res = [1,2,3,4,5].

Слайд 31

Соединение двух списков

domains
list=integer*
predicates
concate(list, list, list) % pervyi spisok, vtoroy spisok,

Соединение двух списков domains list=integer* predicates concate(list, list, list) % pervyi spisok,
ob'edinennyi spisok
clauses
concate([], List2, ResList):- ResList = List2.
concate([H1|Tail1], List2, [H1|ResTail]):- concate(Tail1, List2, ResTail).
goal
concate([1,2,3], [4,5], Res).
Решение: Res = [1,2,3,4,5].

Слайд 32

Особенности SWI Prolog (1)

В Visual Prolog 5.0: Y = X
В SWI Prolog:

Особенности SWI Prolog (1) В Visual Prolog 5.0: Y = X В
Y = X
В Visual Prolog 5.0: Y <> X
В SWI Prolog: not(Y = X)

Слайд 33

Особенности SWI Prolog (2)

В Visual Prolog 5.0: C = A + B
В

Особенности SWI Prolog (2) В Visual Prolog 5.0: C = A +
SWI Prolog: C is A + B
В Visual Prolog 5.0: C*C = A*A + B*B
В SWI Prolog: X is C*C, X is A*A + B*B
Имя файла: Лабораторная-работа.-Оператор-отсечения-в-Прологе-v9.pptx
Количество просмотров: 20
Количество скачиваний: 0