116
Эти утверждения содержат сведения об очках, набранных командами.
Предположим, что необходимо сложить все очки и усреднить их. Сбор очков
в список осуществляется при помощи встроенного предиката findall :
findall(Points,football(_,Points),Point_list)
Здесь Poits является свободной переменной для значений набранных коман-
дами очков, а Point_list - списочной переменной, элементы которой принад-
лежат к тому же
домену, что и Points, в данном случае, к домену real.
Сама работа предиката скрыта от глаз пользователя. В нашем приме-
ре findall просматривает все утверждения с предикатом football, начиная с
первого. Значение переменной Points (116), взятое из этого утверждения,
присваивается голове списка Point_list. Остальные значения Points помеща-
ются в список на последующие
позиции. По завершению работы findall
переменная Point_list принимает значение
[116.0,121.0,114.0,99.0,122.0]
Для подсчета среднего значения набранных очков применяется рекур-
сивное правило
sum_list([],0,0).
sum_list([H|T], Sum, Number) :-
sum_list(T,Sum1,Number1),
Sum = H + Sum1,
Number = Number1 + 1.
Оно напоминает правило sum из гл. 4.
Для получения суммы всех элементов списка 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.