%%% BEGINNING OF THE TRANSLATION %%%


%%%%%% Translation of the rule (fact) rasp_1:
%%		cpu # 5.
rasp_rrule(rasp_1).
%% fact (6)(6'):
rasp_a_atom(rasp_1, 0, cpu, 5).
%% fact (5)(5'):
rasp_fired(rasp_1).
rasp_firings(rasp_1, 1).


%%%%%% Translation of the rule (fact) rasp_2:
%%		scsihd # 5.
rasp_rrule(rasp_2).
%% fact (6)(6'):
rasp_a_atom(rasp_2, 0, scsihd, 5).
%% fact (5)(5'):
rasp_fired(rasp_2).
rasp_firings(rasp_2, 1).


%%%%%% Translation of the rule (fact) rasp_3:
%%		eidehd # 9.
rasp_rrule(rasp_3).
%% fact (6)(6'):
rasp_a_atom(rasp_3, 0, eidehd, 9).
%% fact (5)(5'):
rasp_fired(rasp_3).
rasp_firings(rasp_3, 1).


%%%%%% Translation of the rule (fact) rasp_4:
%%		motherboard # 7.
rasp_rrule(rasp_4).
%% fact (6)(6'):
rasp_a_atom(rasp_4, 0, motherboard, 7).
%% fact (5)(5'):
rasp_fired(rasp_4).
rasp_firings(rasp_4, 1).


%%%%%% Translation of the rule (fact) rasp_5:
%%		rammodule # 20.
rasp_rrule(rasp_5).
%% fact (6)(6'):
rasp_a_atom(rasp_5, 0, rammodule, 20).
%% fact (5)(5'):
rasp_fired(rasp_5).
rasp_firings(rasp_5, 1).


%%%%%% Cleaning R-Rule from CP-Lists
%% Original R-Rule:
%%		[1-1]: pc(server) # 1 :- cpu # 2, (scsihd # 2 > eidehd # 2), motherboard # 1, rammodule # 4.
%% R-Rule cleaned from CP-Lists:
%%		[1-1]: pc(server) # 1 :- cpu # 2, (scsihd # 2 > eidehd # 2), motherboard # 1, rammodule # 4.


%%%%%% Cleaning R-Rule from P-Sets
%% Original R-Rule:
%%		[1-1]: pc(server) # 1 :- cpu # 2, (scsihd # 2 > eidehd # 2), motherboard # 1, rammodule # 4.
%% R-Rule cleaned from P-Sets:
%%		[1-1]: pc(server) # 1 :- cpu # 2, (scsihd # 2 > eidehd # 2), motherboard # 1, rammodule # 4.


%%%%%% Cleaning R-Rule from P-Lists
%% Original R-Rule:
%%		[1-1]: pc(server) # 1 :- cpu # 2, (scsihd # 2 > eidehd # 2), motherboard # 1, rammodule # 4.


%% P-Lists in the R-Rule's body:
%% (scsihd # 2 > eidehd # 2)
%% P-List : (scsihd # 2 > eidehd # 2)
rasp_auxres(rasp_6, rasp_pl_6_1).
1 { rasp_use_pl(rasp_6, scsihd, I, 2, rasp_pl_6_1), rasp_use_pl(rasp_6, eidehd, I, 2, rasp_pl_6_1) } 1 :-
	rasp_use(rasp_6, 2, rasp_pl_6_1, -(NumFirings)),
	rasp_iter(I), I <= NumFirings, rasp_counter(rasp_6, NumFirings).
rasp_res_pl(rasp_6, rasp_pl_6_1, scsihd, 1).
rasp_res_pl(rasp_6, rasp_pl_6_1, eidehd, 2).
%% R-Rule cleaned from P-Lists:
%%		[1-1]: pc(server) # 1 :- cpu # 2, rasp_pl_6_1 # 1, motherboard # 1, rammodule # 4.


%%%%%% Translation of the rule rasp_6:
%%		[1-1]: pc(server) # 1 :- cpu # 2, rasp_pl_6_1 # 1, motherboard # 1, rammodule # 4.
rasp_rrule(rasp_6).
rasp_firings(rasp_6, 1..1).
%% rule (6)(6'):
rasp_a_atom(rasp_6, 0, pc(server), 1).
%% rule (6)(6'):
rasp_a_atom(rasp_6, 1, cpu, -(2)).
%% rule (6)(6'):
rasp_a_atom(rasp_6, 2, rasp_pl_6_1, -(1)).
%% rule (6)(6'):
rasp_a_atom(rasp_6, 3, motherboard, -(1)).
%% rule (6)(6'):
rasp_a_atom(rasp_6, 4, rammodule, -(4)).
%% Policy
rasp_optional(rasp_6).


%%%%%% Amount-Atoms corresponding to P-Lists in the current R-Rule:


%% rasp_pl_6_1 # 1.


%%%%%% Translation of the rule (fact) rasp_7:
%%		rasp_pl_6_1 # 1.
rasp_rrule(rasp_7).
%% fact (6)(6'):
rasp_a_atom(rasp_7, 0, rasp_pl_6_1, 1).
%% fact (5)(5'):
rasp_fired(rasp_7).
rasp_firings(rasp_7, 1).


%%%%%% Cleaning R-Rule from CP-Lists
%% Original R-Rule:
%%		[1-1]: pc(desk) # 1 :- cpu # 1, (eidehd # 2 > scsihd # 2), motherboard # 1, rammodule # 2.
%% R-Rule cleaned from CP-Lists:
%%		[1-1]: pc(desk) # 1 :- cpu # 1, (eidehd # 2 > scsihd # 2), motherboard # 1, rammodule # 2.


%%%%%% Cleaning R-Rule from P-Sets
%% Original R-Rule:
%%		[1-1]: pc(desk) # 1 :- cpu # 1, (eidehd # 2 > scsihd # 2), motherboard # 1, rammodule # 2.
%% R-Rule cleaned from P-Sets:
%%		[1-1]: pc(desk) # 1 :- cpu # 1, (eidehd # 2 > scsihd # 2), motherboard # 1, rammodule # 2.


%%%%%% Cleaning R-Rule from P-Lists
%% Original R-Rule:
%%		[1-1]: pc(desk) # 1 :- cpu # 1, (eidehd # 2 > scsihd # 2), motherboard # 1, rammodule # 2.


%% P-Lists in the R-Rule's body:
%% (eidehd # 2 > scsihd # 2)
%% P-List : (eidehd # 2 > scsihd # 2)
rasp_auxres(rasp_8, rasp_pl_8_1).
1 { rasp_use_pl(rasp_8, eidehd, I, 2, rasp_pl_8_1), rasp_use_pl(rasp_8, scsihd, I, 2, rasp_pl_8_1) } 1 :-
	rasp_use(rasp_8, 2, rasp_pl_8_1, -(NumFirings)),
	rasp_iter(I), I <= NumFirings, rasp_counter(rasp_8, NumFirings).
rasp_res_pl(rasp_8, rasp_pl_8_1, eidehd, 1).
rasp_res_pl(rasp_8, rasp_pl_8_1, scsihd, 2).
%% R-Rule cleaned from P-Lists:
%%		[1-1]: pc(desk) # 1 :- cpu # 1, rasp_pl_8_1 # 1, motherboard # 1, rammodule # 2.


%%%%%% Translation of the rule rasp_8:
%%		[1-1]: pc(desk) # 1 :- cpu # 1, rasp_pl_8_1 # 1, motherboard # 1, rammodule # 2.
rasp_rrule(rasp_8).
rasp_firings(rasp_8, 1..1).
%% rule (6)(6'):
rasp_a_atom(rasp_8, 0, pc(desk), 1).
%% rule (6)(6'):
rasp_a_atom(rasp_8, 1, cpu, -(1)).
%% rule (6)(6'):
rasp_a_atom(rasp_8, 2, rasp_pl_8_1, -(1)).
%% rule (6)(6'):
rasp_a_atom(rasp_8, 3, motherboard, -(1)).
%% rule (6)(6'):
rasp_a_atom(rasp_8, 4, rammodule, -(2)).
%% Policy
rasp_optional(rasp_8).


%%%%%% Amount-Atoms corresponding to P-Lists in the current R-Rule:


%% rasp_pl_8_1 # 1.


%%%%%% Translation of the rule (fact) rasp_9:
%%		rasp_pl_8_1 # 1.
rasp_rrule(rasp_9).
%% fact (6)(6'):
rasp_a_atom(rasp_9, 0, rasp_pl_8_1, 1).
%% fact (5)(5'):
rasp_fired(rasp_9).
rasp_firings(rasp_9, 1).


%%%%%% Domain predicates for P-Lists:
rasp_num(0..1).
rasp_iter(1..1).
rasp_grade(1..2).


%%%%%% Engine for P-Lists:
rasp_resource(Pl) :- rasp_auxres(G, Pl), rasp_rrule(G).
rasp_use(G, Idx, R, TEMP) :- TEMP = U * N, rasp_sum_use_pl(G, R, N, Pl), rasp_res_pl(G, Pl, R, Grade), rasp_rrule(G), rasp_allval(N), rasp_a_atom(G, Idx, Pl, U), N != 0.

rasp_sum_use_pl(G, R, N, Pl) :- N = #sum [ rasp_use_pl(G, R, Iter, Q, Pl) : rasp_firings(G, Iter) : rasp_iter(Iter) : rasp_allval(Q) = Q ], rasp_res_pl(G, Pl, R, Grade), rasp_rrule(G), rasp_allval(N), rasp_auxres(G, Pl).
1 { rasp_sum_use_pl(G, R, N, Pl) : rasp_allval(N) } 1 :- rasp_res_pl(G, Pl, R, Grade), rasp_rrule(G).

rasp_auxpred(G, R, I, Q, Pl, Grade) :- rasp_use_pl(G, R, I, Q, Pl),rasp_res_pl(G, Pl, R, Grade),rasp_rrule(G),rasp_auxres(G,Pl),rasp_val(I),rasp_allval(Q),rasp_grade(Grade),rasp_resource(R).
rasp_num_n_choice(Grade, N) :- N { rasp_auxpred(G, R, I, Q, Pl, Grade) : rasp_allval(Q) : rasp_resource(R) : rasp_rrule(G) : rasp_auxres(G,Pl) : rasp_val(I) } N, rasp_allval(N), rasp_grade(Grade).
1 { rasp_num_n_choice(Grade, N) : rasp_val(N) } 1 :- rasp_grade(Grade).
#maximize [ rasp_num_n_choice(2, N) : rasp_val(N) = N ].
#maximize [ rasp_num_n_choice(1, N) : rasp_val(N) = N ].


%%%%%% Domain predicates:
rasp_val(0..30).
rasp_allval(-30..30).
rasp_idx(0..4).


%%%%%% Resources:
rasp_resource(cpu).
rasp_resource(eidehd).
rasp_resource(motherboard).
rasp_resource(pc(desk)).
rasp_resource(pc(server)).
rasp_resource(rammodule).
rasp_resource(rasp_pl_6_1).
rasp_resource(rasp_pl_8_1).
rasp_resource(scsihd).


%%%%%% Main engine (PAPER):
rasp_res_rrule(Res, Rule) :- rasp_a_atom(Rule, I, Res, Q).
rasp_fired(Rule) :- not rasp_notfired(Rule), rasp_rrule(Rule).
rasp_notfired(Rule) :- not rasp_fired(Rule), rasp_rrule(Rule).
rasp_use(Rule, I, Res, TEMP) :- TEMP = C * Q, rasp_fired(Rule), rasp_counter(Rule, C), rasp_firings(Rule, C), rasp_resource(Res), rasp_a_atom(Rule, I, Res, Q).
rasp_fired(Rule) :- rasp_use(Rule, I, Res, TEMP), TEMP = C * Q, rasp_counter(Rule, C), rasp_firings(Rule, C), rasp_resource(Res), rasp_a_atom(Rule, I, Res, Q).
rasp_notfired(Rule) :- not rasp_use(Rule, I, Res, TEMP), TEMP = C * Q, rasp_counter(Rule, C), rasp_firings(Rule, C), rasp_resource(Res), rasp_a_atom(Rule, I, Res, Q).

rasp_notcounter(G, C) :- rasp_counter(G, D), rasp_firings(G, C), C != D, rasp_rrule(G), rasp_firings(G, D).
rasp_counter(G, C) :- rasp_firings(G, C), rasp_fired(G), not rasp_notcounter(G, C).
:- not rasp_fired(G), rasp_counter(G, C), rasp_rrule(G), rasp_firings(G, C).

rasp_balance(Res, N) :- N = #sum [ rasp_use(Rule, Idx, Res, Q) : rasp_rrule(Rule) : rasp_idx(Idx) : rasp_allval(Q) = Q ], rasp_resource(Res).
:- rasp_balance(Res, N), N < 0, rasp_resource(Res), rasp_allval(N).




%%%%%% Mr.Hyde:
#hide rasp_auxatom.
#hide rasp_cons(X,Y,Z,W).
#hide rasp_consumes(X,Y,Z).
#hide rasp_enabled(X).
#hide rasp_enbld(X,Y).
#hide rasp_firings(X,Y).
#hide rasp_idx(X).
#hide rasp_num(X).
#hide rasp_prod(X,Y,Z,W).
#hide rasp_produces(X,Y,Z).
#hide rasp_resource(X).
#hide rasp_RID.
#hide rasp_rrule(X).
#hide rasp_use_n(X,Y,Z,W).
#hide rasp_use_p(X,Y,Z,W).
#hide rasp_val(X).
#hide rasp_optional(X).
#hide rasp_thrifty(X).
#hide rasp_prodigal(X).
#hide rasp_use(X,Y,Z,W).
#hide rasp_extraneeded(X,Y,Z).
#hide rasp_notcounter(X,Y).
#hide rasp_allval(X).
#hide rasp_res_rrule(X,Y).
#hide rasp_auxres(X,Y).
#hide rasp_use_pl(X,Y,Z,W).
#hide rasp_res_pl(X,Y,Z,W).
#hide rasp_sum_use_pl(X,Y,Z,W).
#hide rasp_num_n_choice(X,Y).
#hide rasp_grade(X).
#hide rasp_iter(X).
#hide rasp_cl(X,Y,Z).
#hide rasp_eq(X,Y,Z).
#hide rasp_idx(X,Y,Z).
#hide rasp_num(X,Y).
#hide rasp_dom(X,Y).
#hide rasp_used_idx(X,Y).
#hide rasp_pset_name(X).
#hide rasp_order(X,Y,Z).
#hide rasp_other(X,Y,Z).
#hide rasp_ordered(X,Y,Z,W,U,V).
#hide rasp_auxpred(X,Y).


%%% END OF THE TRANSLATION %%%

