:- [flags,ops,about,sets,wme,lists,io,best,abcde,w,demos].

score(Name,W) :-
	relation(Name,_,Scores,_),
	last(W,_ = About), print(About),nl,
	score1(About,Scores,S),
	print(S),nl.

score1(About,Scores,Out) :-
	score2(About,Scores,0,N,0,S),
	Out is S/N.

score2([]             ,_     ,N ,N,S, S).
score2([Klass=Items|T],Scores,N0,N,S0,S) :-
	length(Items,N1),
	member(Klass=Score,Scores),
	score2(T,Scores,N0+N1,N,S0+Score*N1,S).

scores0(Name,W,S=(Key=Value)) :-
	relation(Name,_,Scores,_),
	append(Inputs,[+Klass=_],W),
	member(Key   = About,Inputs),
	member(Value = Rows, About),
	scores0a(Rows,Klass,Scores,0,N,0,Sum),
	S is Sum/N.

scores0a([]        ,_    ,_     ,N ,N,S ,S).
scores0a([Row|Rows],Klass,Scores,N0,N,S0,S) :-
	memo(Row,Klass,What),
	member(What=S1,Scores),
	scores0a(Rows,Klass,Scores,N0+1,N,S0+S1,S).
