nelcesto(a).
nelcesto(b).
nelcesto(c).
nelcesto(d).

sov(X,a):- nelcesto(X), not(X==a).
sov(b,c).
sov(d,b).



giust([X],[ok(altezza1([X]))]):- nelcesto(X).
giust([X],[no(nelcesto(X))]) :- not(nelcesto(X)).

giust([X,Y|R],[S|G]) :- 
          obs(nelcesto(X),SC), 
          obs(sov(X,Y),SV), 
          obs(member(X,[Y|R]), RP),
          spiega(SC,SV,RP,S), 
          giust([Y|R],G).


obs(nelcesto(X),[1,nelcesto(X)]) :- nelcesto(X),!.
obs(nelcesto(X),[0,nonNelcesto(X)]).

obs(sov(X,Y),[1,sov(X,Y)]) :- sov(X,Y),!.
obs(sov(X,Y),[0,nonSov(X,Y)]).

obs(member(X,Y),[0,ripetuto(X)]) :- member(X,Y), !.
obs(member(X,_),[1,nonrip(X)]).

spiega([0,S1],[0,S2],[0,S3],no(S1,S2,S3)).
spiega([0,S1],[0,S2],[1,_],no(S1,S2)).
spiega([0,S1],[1,_],[0,S3],no(S1,S3)).
spiega([0,S1],[1,_],[1,_],no(S1)).
spiega([1,_],[0,S2],[0,S3],no(S2,S3)).
spiega([1,_],[0,S2],[1,_],no(S2)).
spiega([1,_],[1,_],[0,S3],no(S3)).
spiega([1,S1],[1,S2],[1,S3],ok(S1,S2,S3)).



