Добавил:
Upload
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз:
Предмет:
Файл:
ЛЕКЦИЯ 10
9.11.12
№1
domains
list = integer*
predicates
readlist(list)
find_sr(list, integer, integer)
find_aver(list, real)
clauses
readlist([H|T]) :- readint(H), H<>0, readlist(T).
readlist(L) :- !.
find_sr([], 0, 0) :- !.
find_sr([H|T], S, N) :- find_sr(T, NewS, NewN), S = NewS+H, N = NewN+1.
find_aver(L, X) :- find_sr(L, S, N), N<>0, !, X = S/N.
find_aver(_, _) :- write("List is empty."), fail.
goal
readlist(L), find_aver(L, X), write(X).
______________________________________
Цель надо разбивать на ряд максимально коротких!!!
______________________________________
№2
Имеет список целых. Найти минимальный элемент.
find_m([H|[]], _, H) :- !.
find_m([H|T], M, X) :- H < M, !, NewM = H, find_m(T, NewM, X).
find_m([H|T], M, X) :- find_m(T, M, X).
min_list(N, [H|T]) :- find_m(T, H, X), write(X).
min_list(X, [X]) :- !.
min_list(N, [H|T]) :- min_list(NT, T), min(NT, H, N).
______________________________________
База знаний -- это набор фактов.
Пусть у нас есть список студентов.
person(имя, группа, возраст)
Задача -- узнать средний возраст студентов.
findall(V, P, L)
V -- определяет параметр, который необходимо собрать в список
P -- предикат, из которого будут собираться значения
L -- собственно сам список
Например, чтобы составить список возрастов:
findall(V, person(_, _, V), L)
Только для 1-й группы:
findall(V, person(_, 1, V), L)
______________________________________
№3
aver(X) :- findall(V, person(_, 2, V), L), find_aver(L, X), write(X).
______________________________________
Было бы очень здорово работать со списками, элементы которых разные.
В SWI-Prolog это делается просто:
[1, a, [2,3]]
В Турбо и VIP это не прокатит, поэтому придумали составные домены:
domains
element = i(integer); r(real); c(char); l(el_list)
el_list = element*
Сам список тогда будет выглядеть вот каким образом:
[i(1), c(a), el_list([2,3])]
______________________________________
Сортировка списка
Найти два смежных элемента x>y, поменять их местами, получить новый список и отсортировать этот список. Если в списке нет ни одной такой пары, завершаем процедуру.
sort(L, S) :- swap(L, M), !, sort(M, S).
sort(L, L) :- !.
swap([X, Y|R], [Y, X|R]) :- Y<X.
swap([X|R], [X|R1]) :- swap(R, R1).
______________________________________
9.11.12
№1
domains
list = integer*
predicates
readlist(list)
find_sr(list, integer, integer)
find_aver(list, real)
clauses
readlist([H|T]) :- readint(H), H<>0, readlist(T).
readlist(L) :- !.
find_sr([], 0, 0) :- !.
find_sr([H|T], S, N) :- find_sr(T, NewS, NewN), S = NewS+H, N = NewN+1.
find_aver(L, X) :- find_sr(L, S, N), N<>0, !, X = S/N.
find_aver(_, _) :- write("List is empty."), fail.
goal
readlist(L), find_aver(L, X), write(X).
______________________________________
Цель надо разбивать на ряд максимально коротких!!!
______________________________________
№2
Имеет список целых. Найти минимальный элемент.
find_m([H|[]], _, H) :- !.
find_m([H|T], M, X) :- H < M, !, NewM = H, find_m(T, NewM, X).
find_m([H|T], M, X) :- find_m(T, M, X).
min_list(N, [H|T]) :- find_m(T, H, X), write(X).
min_list(X, [X]) :- !.
min_list(N, [H|T]) :- min_list(NT, T), min(NT, H, N).
______________________________________
База знаний -- это набор фактов.
Пусть у нас есть список студентов.
person(имя, группа, возраст)
Задача -- узнать средний возраст студентов.
findall(V, P, L)
V -- определяет параметр, который необходимо собрать в список
P -- предикат, из которого будут собираться значения
L -- собственно сам список
Например, чтобы составить список возрастов:
findall(V, person(_, _, V), L)
Только для 1-й группы:
findall(V, person(_, 1, V), L)
______________________________________
№3
aver(X) :- findall(V, person(_, 2, V), L), find_aver(L, X), write(X).
______________________________________
Было бы очень здорово работать со списками, элементы которых разные.
В SWI-Prolog это делается просто:
[1, a, [2,3]]
В Турбо и VIP это не прокатит, поэтому придумали составные домены:
domains
element = i(integer); r(real); c(char); l(el_list)
el_list = element*
Сам список тогда будет выглядеть вот каким образом:
[i(1), c(a), el_list([2,3])]
______________________________________
Сортировка списка
Найти два смежных элемента x>y, поменять их местами, получить новый список и отсортировать этот список. Если в списке нет ни одной такой пары, завершаем процедуру.
sort(L, S) :- swap(L, M), !, sort(M, S).
sort(L, L) :- !.
swap([X, Y|R], [Y, X|R]) :- Y<X.
swap([X|R], [X|R1]) :- swap(R, R1).
______________________________________
Соседние файлы в папке Шумихин