Recursion 如何在Prolog中进行递归计数和求和
我试图找出如何在计数和求和规则上使用递归 我通常使用列表,使用findall和length或findall和sum_列表,但我不确定这是否是所有情况下的最佳选择 这是我的列表方法:Recursion 如何在Prolog中进行递归计数和求和,recursion,prolog,Recursion,Prolog,我试图找出如何在计数和求和规则上使用递归 我通常使用列表,使用findall和length或findall和sum_列表,但我不确定这是否是所有情况下的最佳选择 这是我的列表方法: %person(name, surname, age) person('A', 'H', 22). person('B', 'G', 24). person('C', 'F', 20). person('D', 'E', 44). person('E', 'D', 45). person('F', 'C', 51).
%person(name, surname, age)
person('A', 'H', 22).
person('B', 'G', 24).
person('C', 'F', 20).
person('D', 'E', 44).
person('E', 'D', 45).
person('F', 'C', 51).
person('G', 'B', 40).
person('H', 'A', 51).
count_person(Total_count) :- % rule to count how many person are.
findall(N, person(N, _, _), List),
length(List, Total_count).
sum_ages(Total_sum) :- % rule to sum all the ages.
findall(Age, person(_, _, Age), List),
sum_list(List, Total_sum).
或在此:
我应该如何使用递归实现这一点?我没有一个优雅的解决方案。但是使用
retract
和assert
可以控制递归:
:- dynamic([person/3,person1/3]).
count_person(N) :-
count_person(0,N).
count_person(Acc,N) :-
retract(person(A,B,C)),
!,
assert(person1(A,B,C)),
N1 is Acc+1,
count_person(N1,N).
count_person(N,N) :-
clean_db.
clean_db :-
retract(person1(A,B,C)),
assert(person(A,B,C)),
fail.
clean_db.
您应该看看library() 例如:
count_person(Total_count) :-
aggregate(count, A^B^C^person(A,B,C), Total_count).
或者更简单的形式(尝试理解差异,这是学习基本变量量化的好方法)
该库的发展是为了简化SQL中可用的典型聚合函数的实现(因为Prolog的核心是关系型的):
您还可以在一个步骤中获得组合的聚合。平均值易于实现:
ave_ages(Ave) :-
aggregate(t(count,sum(Age)), A^B^person(A,B,Age), t(Count,Sum)), Ave is Sum/Count.
如果使用count_person/1和sum_ages/1实现,解释器将扫描两次目标
sum_ages(Total_sum) :-
aggregate(sum(Age), A^B^person(A,B,Age), Total_sum).
ave_ages(Ave) :-
aggregate(t(count,sum(Age)), A^B^person(A,B,Age), t(Count,Sum)), Ave is Sum/Count.