% ----------------------------------------------------------------------
% -- ensure that companion files are charged

:- ensure_loaded(pref0203).

% ----------------------------------------------------------------------
% -- the real transformation

add_preferences( (Head :- name(N), Body), Rules ) :-
        add_preferences_body(Body, N, BodyRules),
        Rule0 = (Head  :- ap(N)               ),
        Rule1 = (ap(N) :- name(N), ok(N), Body),   % name(N) is left for later usage
        RuleH = (head(N)  :- Head             ),   % WANG et al
        conjoin(Rule0,Rule1,Rules01),
        conjoin(RuleH,Rules01,RulesH01),
        conjoin(RulesH01, BodyRules, Rules).
add_preferences( (Head :- name(N)), Rules ) :-
        add_preferences( (Head :- name(N), true), Rules ).
add_preferences( F, F ) :-
        writeln_verbosely('Leaving ':F:' untouched').

ok_rules( Rules, OKRules ) :-
        extract_oko_literals_from_rules(Rules,N,OKOLiterals),
        QRule  = (  ok(N)    :- name(N), OKOLiterals                     ),
        CRules = ( (oko(N,M) :- name(N), name(M), not ((N < M))          ),
                   (oko(N,M) :- name(N), name(M),      (N < M) , ap(M)   ),
                   (oko(N,M) :- name(N), name(M),      (N < M) , bl(M)   ),
                   (oko(N,M) :- name(N), name(M),      (N < M) , head(M) ) ),   % WANG et al
        conjoin(QRule,CRules,OKRules).

% ----------------------------------------------------------------------
% -- Rules to Procedures

builtin(not,1).
builtin(neg,1).
% builtin(-,1). --> neg
% builtin(~,1). --> not
% builtin(<,2). --> pref

builtin(ok,1).
builtin(oko,2).
builtin(ap,1).
builtin(bl,1).
builtin(head,1).

