Предикат findall

findall(Variable,<предикат>,ListVariable) - записывает значение объекта Variable в список ListVariable. Variable должен являться одним из аргументов указанного предиката.

Рекурсивная процедура хранит память о промежуточных результатах по мере выполнения программы, так как она передает информацию через параметры от одного рекурсивного вызова к другому. Но рекурсия не может осуществить поиск всех альтернативных решений в цели, который обычно выполняет поиск с возвратом. Поэтому, когда вам нужны все решения для целевого утверждения, и они необходимы все сразу, как часть единой составной структуры, то вы будете использовать встроенный предикат findall. Этот предикат использует целевое утверждение в качестве одного из своих аргументов и собирает все решения для этого целевого утверждения в единый список методом поиска с возвратом.

Листинг 6.2.1. использование предиката findall

/*Пусть есть БД – группа студентов, есть отметки, полученные студентом на экзамене по ФЛП Найти средний балл по указанной группе*/

domains

name=string

mark=integer

list=mark* % список оценок

predicates

student(name,mark) % предикат БД

sum_list(list,mark,integer) % сумма всех оценок в списке по ФЛП

report_average_student_mark %средний балл

goal

report_average_student_mark.

clauses

student(“Орлов”,4).

student(“Абрамов”,3).

student(“Смирнов”,5).

report_average_student_mark:-

findall(Mark,student(_,Mark),Mark_list),

sum_list(Mark_list,Sum,Number),

Average=Sum/Number,

write(“Группа студентов по дисциплине имеет:”),nl,

write(“Средний балл=”,Average).

sum_list([],0,0).

sum_list([H|T],Sum,Number):-

sum_list(T,Sum1,Number1),

Sum=H+Sum1,

Number=Number1+1.

Операции со структурами данных.

Сортировка списков

Список может быть упорядочен (отсортирован), если между его элементами определено отношение порядка.

Отношение порядка – больше(x,y)

ask_order(X,Y):-

X>Y (для чисел)

Если элементы списка – атомы, то отношение “больше”

соответствует алфавитному порядку.

В качестве примера приведем программу, реализующую быструю сортировку.





Подборка статей по вашей теме: