/* GoogleAds */

Главная

ПРОЕКТ "ЧЕЛОВЕК. ЗЕМЛЯ. ВСЕЛЕННАЯ"

Инструменты пользователя

Инструменты сайта


project:prolog:listing:komponovka_dannyx



Программа «Компоновка данных»

Демонстрация компоновки данных в список с целью вычисления среднего значения с помощью предиката findall.

/* 6.6.2013
Среда - Turbo Prolog
Программа «Очки» реализует компоновку данных в список с целью вычисления среднего значения с помощью предиката findall.
 
Иногда возникает необходимость собрать данные из базы данных в список для последующей их обработки.
Пролог содержит встроенный предикат findall, позволяющий выполнить эту задачу.
 
Требуемый список (целевой) представляется означенной переменной, являющейся одним из объектов предиката.
Предописание встроенного предиката findall выглядит следующим образом:
 
  findall(Variable_name, Predicate_expression, List_name).
 
Variable_name обозначает здесь объект входного предиката Predicate_expression, а List_name является именем переменной выходного списка.
Переменная должна относиться к домену списков, объявленному в разделе domains. */
 
domains
name = string
points = real
list = points *
 
predicates
football(name,points)
sum_list(list,points,integer)
report_average_football_score
 
clauses
/* Названия команд и очки, набранные ими */
football("Спартак",116).
football("ЦСКА",121).
football("Зенит",114).
football("Локомотив", 99). 
football("Динамо",122).
 
/* Сбор очков в список осуществляется при помощи встроенного предиката  findall(Points,football(_,Points),Point_list)
 
Здесь Poits является свободной переменной для значений набранных командами очков, а Point_list - списочной переменной,
элементы которой принадлежат к тому же домену, что и Points, в данном случае, к домену integer.
 
Сама работа предиката скрыта от глаз пользователя.
 
findall просматривает все утверждения с предикатом football, начиная с первого.
Значение переменной Points (116), взятое из первого утверждения, присваивается голове списка Point_list.
Остальные значения Points помещаются в список на последующие позиции.
По завершению работы findall переменная Point_list принимает значение [116,121,114,99,122]  */
 
report_average_football_score :- findall(Points,football(_,Points), Point_list), sum_list(Point_list,Sum,Number), Average = Sum / Number, write("Всего очков набраны командами: ", Sum), nl, write("Среднее количество очков = ", Average). 
 
/* Цель представляет собой правило, содержащее подцели findall, sum_list, Average, а также предикаты, осуществляющие вывод полученных результатов в нужной форме.
 
Начиная свою работу программа, пытается удовлетворить подцель findall в том виде, в котором она была описана.
 
Когда подцель удовлетворена, делается попытка удовлетворить подцель sum_list, а затем Average.
 
Для подсчета среднего значения набранных очков применяется рекурсивное правило sum_list([],0,0).
Для получения суммы всех элементов списка Point_list это правило необходимо задать в качестве подцели
 
sum_list(Point_list,Sum,Number). 
 
Сначала Пролог сопоставляет эту подцель с вариантом правила sum_list([H|T],Sum,Number).
Point_list при этом сопоставляется с [H|T], а переменные Sum и Number оказываются неопределенными.
Рекурсии с первым вариантом правила продолжаются до тех пор, пока Point_list не превратиться в нулевой список; на каждой рекурсии очередной элемент списка помещается в стек.
 
Далее Пролог пытается удовлетворить правило sum_list([],0,0).
Переменным Sum и Number присваиваются нули, и таким образом правило полностью удовлетворено.
Сворачивая рекурсию sum_list, Пролог последовательно, один за другим, извлекает из стека засланные туда элементы и складывает их с
уже имеющимся значением суммы; при этом переменная Number каждый раз увеличивается на единицу.
В итоге имеем следующие формы sum_list:
 
sum_list([122],122,1)
sum_list([99,122],221,2)
sum_list([114,99,122],335,3)
sum_list([121,114,99,122],456,4)
sum_list([116,121,114,99,122],572,5)
 
По окончанию рекурсий значениями переменных Sum и Number являются соответственно 572 и 5.
 
Правило для нахождения среднего значения набранных очков:
 
Average = Sum / Number */
 
sum_list([],0,0).
sum_list([H|T], Sum, Number) :- sum_list(T,Sum1,Number1), Sum=H+Sum1, Number=Number1+1.
 
goal
/* Внутренняя цель */
report_average_football_score.

!!Рекомендуем: Что должен знать современный человек?Семейная Энциклопедия ЗдоровьяСамоанализ. Работа над собойОглавлениеГлавная сайта

project/prolog/listing/komponovka_dannyx.txt · Последние изменения: 2023/09/03 22:22 (внешнее изменение)

Вы можете оставить свои комментарии в разделе "Обсуждение".
Рекомендуем оформить подписку на новости данного раздела. Для этого нажмите на кнопку "Подписаться", расположенную справа снизу каждой страницы (знак конверта).




Индекс цитирования