%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% fluent(contains(L), 0, Max) :- (node(L);source(L);target(L)), maxcontained(Max). agent(pippo). agent(pluto). agent(topolino). action([A], pump_in(P)) :- agent(A), pump(P). executable([Agent], pump_in(P), [contains(A) gt Loss]) :- action([Agent], pump_in(P)), link(A,_B,P,Loss). concurrency_constraint((actocc([Agent1], pump_in(P1)) * actocc([Agent2], pump_in(P2))) eq 0 ) :- action([Agent1], pump_in(P1)), action([Agent2], pump_in(P2)), neq(Agent2,Agent1), link(_,B,P1,_), link(_,B,P2,_). concurrency_constraint((actocc([Agent1], pump_in(P1)) * actocc([Agent2], pump_in(P2))) eq 0 ) :- action([Agent1], pump_in(P1)), action([Agent2], pump_in(P2)), neq(Agent2,Agent1), link(A,_,P1,_), link(A,_,P2,_). causes(contains(A) eq 0, [actocc([Agent], pump_in(P))]) :- action([Agent], pump_in(P)), link(A,_B,P,_Loss). causes(contains(B) eq (contains(B)^(-1) + contains(A)^(-1) - Loss), [actocc([Agent], pump_in(P))]) :- action([Agent], pump_in(P)), link(A,B,P,Loss). %causes(_,_,_):-1 is 2. %%%% initially(contains(A) eq 25) :- source(A). initially(contains(A) eq 0) :- (node(A);target(A)). %goal(contains(target3) gt 30). goal(contains(target2) gt 50). %goal(contains(target1) gt 60). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% % prnodes:-node(N,X,Y), format("node(~w,~w,~w)\n",[N,X,Y]), fail. % prnodes. % prlinks:-link(F,T,N,L), format("link(~w,~w,~w,~w)\n",[F,T,N,L]), fail. % prlinks. %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% maxcontained(100). %massima magnitudine possibile di una massa di fuel (in teoria, la sum di tutti i source) dimension(4). kappa(100). %intero maggiore di dimension, usato per codificare coppie di interi xax(X) :- dimension(Dim), D is Dim-1,interval(X,0,D). yax(Y) :- dimension(Dim), D is Dim-1,interval(Y,0,D). %target(target1). target(target2). %target(target3). source(source1). source(source2). source(source3). node(N,X,Y) :- xax(X), yax(Y), kappa(K), N is Y + X*K. node(N) :- node(N,_,_). link(source1, N, s1n000, 0) :- node(N,0,0). link(source2, N, s2n100, 0) :- node(N,1,0). link(source3, N, s3n300, 0) :- node(N,3,0). %link(N, target1, to_t1, 0) :- dimension(Dim), D is Dim-1, node(N,1,D). link(N, target2, to_t2, 0) :- dimension(Dim), D is Dim-1, node(N,2,D). %link(N, target3, to_t3, 0) :- dimension(Dim), D is Dim-1, node(N,3,D). link(N1, N2, Pump, Loss) :- dimension(Dim), node(N1,X1,Y1), Y2 is Y1+1, ( (node(N2,X1,Y2), Loss is X1) ; (X2 is (X1+Dim-1) mod Dim, node(N2,X2,Y2), Loss is X2) ; (X2 is (X1+1) mod Dim, node(N2,X2,Y2), Loss is X2) ), kappa(K), Pump is N2 + N1*K*K. pump(Pump) :- link(_N1, _N2, Pump, _Loss). %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%