primitive_action(addS(N)).
primitive_action(releaseS(N)).
primitive_action(releaseL(N)).
primitive_action(exert(N)).

contr(small, A, V, S):- A=addS(N), V is N;
                        A=releaseS(N), V is -N;
			not (A=addS(N) ; A=releaseS(N)),
			V is 0.

contr(medium,A,V,S):- A=releaseS(N), V is N;
	              not A=releaseS(N), V is 0.

contr(large,A,V,S):- A=releaseL(N), V is -N;
	             not A=releaseL(N), V is 0.

contr(force,A,V,S):- A=exert(N), V is N;
	             not A=exert(N), V is 0.


value(small,V,S):- small(V,S).
value(medium,V,S):- medium(V,S).
value(large,V,S):- large(V,S).
value(force,V,S):- force(V,S).

%% Succ State Axioms

small(V,do(C,S)):- small(Vs,S),
	           tContr(small,C,Vc,S),
		   V is Vs + Vc.

medium(V,do(C,S)):- medium(Vs,S),
	            tContr(medium,C,Vc,S),
		    V is Vs + Vc.

large(V,do(C,S)):- large(Vs,S),
	           tContr(large,C,Vc,S),
		   V is Vs + Vc.

force(V,do(C,S)):- force(Vs,S),
	           tContr(force,C,Vc,S),
		   V is Vs + Vc.

%% All primitive actions are always possible

poss(A,S):- primitive_action(A).

conflict(C,S):- member(addS(N),C), member(addS(N1),C), not N=N1;
	        member(releaseS(N),C), member(releaseS(N1),C), not N=N1;
		member(releaseL(N),C), member(releaseL(N1),C), not N=N1;
		member(exert(N),C), member(exert(N1),C), not N=N1.

medium <-+- 1 * small.
large <-+- 1 * medium.
force <-+-- 2 * large.
force <--+- 2 * large.
foo <--- bar.
