
superimpose_clauses([]):-!.
superimpose_clauses(Hs,ClausesWithFrequencists4):-
    renormalise(Hs,Hs1),
    sort(Hs1,SortedHs),reverse(SortedHs,SortedHs1),print_list(SortedHs1),
    clauses_frequencies(Hs1,ClausesWithFrequencists),
    sort(ClausesWithFrequencists,ClausesWithFrequencists1),reverse(ClausesWithFrequencists1,ClausesWithFrequencists2),
    portray_clause(superimposed_clauses(ClausesWithFrequencists2)),
    %print_list(ClausesWithFrequencists2),
%write('/*'),nl,
    maplist(rewriteOuput,ClausesWithFrequencists2).
%write('*/'),nl.



renormalise(Hs,Hs1):-
    maplist(extractProb,Hs,Probs,ProbHs),
    sumList(Probs,ProbSum),
    maplist(renormalise0(ProbSum),ProbHs,Hs1).

extractProb(H,Prob,hyp(Prob,H)):-
    prior(H,Prob).

renormalise0(Sum,hyp(Prob,H),hyp(Prob1,H)):-
    Prob1 is Prob/Sum. 


clauses_frequencies([],[]).
clauses_frequencies([hyp(Prob,Hyp)|Hs],ClausesWithFrequencists):-
    clauses_frequencies(Hs,PreClausesWithFrequencists),
    update_clauses_frequencies(Prob,Hyp,PreClausesWithFrequencists,ClausesWithFrequencists).



update_clauses_frequencies(Prob,[],ClausesWithFrequencists,ClausesWithFrequencists).
update_clauses_frequencies(Prob,[MetaCla|Hyp],ClausesWithFrequencistsSofar,ClausesWithFrequencists):-
(append(Pre,[PreFrequency-MetaCla|Post],ClausesWithFrequencistsSofar)->
Frequency is PreFrequency+Prob,
append(Pre,[Frequency-MetaCla|Post],NewClausesWithFrequencistsSofar);
NewClausesWithFrequencistsSofar=[Prob-MetaCla|ClausesWithFrequencistsSofar]
),
update_clauses_frequencies(Prob,Hyp,NewClausesWithFrequencistsSofar,ClausesWithFrequencists).






rewriteOuput(Prob-invPred(Pred)). 
rewriteOuput(Prob-metasub(Type,Preds)):-
    %rewriteOuput0(Type,Preds),write(':'),Weigtht is Prob*100,write(Weigtht),nl.
    write(Prob),write('::'),rewriteOuput0(Type,Preds),write('.'),nl.


rewriteOuput0(tailrec,[HeadPre,BodyPre]):-
    write(tailrec(HeadPre,BodyPre)).
    %write(HeadPre),write('(X,Z)'),write('<-'),write(BodyPre),write('(X,Y)'),write(','),write(HeadPre),write('(Y,Z)').
rewriteOuput0(chain,[HeadPre,BodyPre1,BodyPre2]):-
    write(chain(HeadPre,BodyPre1,BodyPre2)).
    %write(HeadPre),write('(X,Z)'),write('<-'),write(BodyPre1),write('(X,Y)'),write(','),write(BodyPre2),write('(Y,Z)').
rewriteOuput0(base,[HeadPre,BodyPre]):-
    %write(HeadPre),write('(X,Y)'),write('<-'),write(BodyPre),write('(X,Y)').
    write(base(HeadPre,BodyPre)). 
rewriteOuput0(instance,[P,X,Y]):-
    %write(P),write('('),write((X,Y)),write(')').
    write(instance(P,X,Y)).

rewriteOuput0(acceptor,[s(X)]):-write(acceptor(s(X))).
rewriteOuput0(delta,[s(Q),T,s(P)]):-write(delta(s(Q),T,s(P))).





/************** Normalising clauses with the same head **********/
/* Not used
normalise_sameHeadClauses(ClausesWithFrequencists,NormalisedClausesWithFrequencists):-
    group_sameHeadClauses(ClausesWithFrequencists,GroupedClausesWithFrequencists),
    normalise_sameHeadClauses0(GroupedClausesWithFrequencists,NormalisedClausesWithFrequencists0),
    flatten(NormalisedClausesWithFrequencists0,NormalisedClausesWithFrequencists),
    nl,write('%SLP:'),nl,
    print_list(NormalisedClausesWithFrequencists),nl.


group_sameHeadClauses([],[]).
group_sameHeadClauses([Prob-metasub(Type,[HeadPred|Preds])|ClausesWithFrequencists],GroupedClausesWithFrequencists):-
    group_sameHeadClauses(ClausesWithFrequencists,GroupedClausesWithFrequencistsPre),
    (append(Pre,[HeadPred-SubList|Post],GroupedClausesWithFrequencistsPre)->
        append(Pre,[HeadPred-[Prob-metasub(Type,[HeadPred|Preds])|SubList]|Post],GroupedClausesWithFrequencists);
        GroupedClausesWithFrequencists=[HeadPred-[Prob-metasub(Type,[HeadPred|Preds])]|GroupedClausesWithFrequencistsPre]
    ).

normalise_sameHeadClauses0([],[]).
normalise_sameHeadClauses0([HeadPred-ClaList|Grouped],[NormalisedClaList|Normalised]):-
    normalise_sameHeadClauses0(Grouped,Normalised),
    maplist(getProbLabel,ClaList,Probs),
    sumList(Probs,ProbTotal),
    maplist(normalise(ProbTotal),ClaList,NormalisedClaList).

getProbLabel(Prob-Cla,Prob).

normalise(ProbTotal,Prob-Cla,Prob1-Cla):-
    Prob1 is Prob/ProbTotal. 
*/
