Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

Шумихин / Шумихин / Шумихин - лекция 10

.txt
Скачиваний:
6
Добавлен:
20.05.2015
Размер:
3.01 Кб
Скачать
ЛЕКЦИЯ 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).
______________________________________

Соседние файлы в папке Шумихин