constraints clcons/1, consb/1, consc/1, consc1/2, carriesc/3. %%%%%%%%%%%%%%%%%%%%%%%%%%%%% Assignment 2.1 (a) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% clcons([]) <=> true. clcons([F|Z]) <=> \+ (F = cleaned(X, Y)) | clcons(Z). clcons([F|Z]) <=> F = cleaned(X, Y) | [X, Y]::[1..5], clcons(Z). %% Queries q21a(Y) :- Y::[1..5], Z0=[at(1,Y), cleaned(1, Yp) | Z], Yp #= Y-3, clcons(Z0). %%%%%%%%%%%%%%%%%%%%%%%%%%%%% Assignment 2.1 (b) %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% consb([]) <=> true. consb([F|Z]) <=> \+ (F = empty(B) ; F = carries(B, R)) | consb(Z). consb([F|Z]) <=> F = empty(B) | not_holds_all(carries(B, _), Z), B::[1..3], consb(Z). consb([F|Z]) <=> F = carries(B, R) | not_holds_all(carries(B, _), Z), B::[1..3], R::[1..6], consb(Z). %% Queries q21b1(Z0, Z) :- Z0 = [at(1), empty(3), carries(2, 3), empty(1) | Z], consb(Z0). q21b2(Z0, Z) :- Z0 = [at(1), empty(2), carries(2, 3), empty(3) | Z], consb(Z0). %%%%%%%%%%%%%%%%%%%%%%%%%%%%% Assignment 2.2 %%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% consc(Z) <=> nonvar(Z) | consc1(Z, Z). consc1(Z, _) <=> var(Z) | consc(Z). consc1([], Z) <=> true. consc1([F|T], Z) <=> \+ F = insof(X, Y) | consc1(T, Z). consc1([F|T], Z) <=> F = insof(X, Y) | carriesc(X, Y, Z), consc1(T, Z). carriesc(X, Y, []) <=> true. carriesc(X, Y, [F|T]) <=> \+ (F = carries(X) ; F = carries(Y)) | carriesc(X, Y, T). carriesc(X, Y, [F|T]) <=> F = carries(X) | holds(carries(Y), T). carriesc(X, Y, [F|T]) <=> F = carries(Y) | holds(carries(X), T). carriesc(X, Y, Z) <=> not_holds(carries(X), Z) | not_holds(carries(Y), Z). carriesc(X, Y, Z) <=> not_holds(carries(Y), Z) | not_holds(carries(X), Z). %% Queries q22a(Z0) :- Z0 = [at(1), carries(obj2), insof(obj1, obj2), carries(obj1) |Z], consc(Z0). q22b(Z0) :- Z0 = [at(1), carries(obj2), insof(obj1, obj2) |Z], consc(Z0). q22c(Z0) :- Z0 = [at(1), insof(obj1, obj2) |Z], consc(Z0). q22d(Z0) :- Z0 = [at(1), carries(obj2), insof(obj1, obj2), carries(obj1)], consc(Z0). q22e(Z0) :- Z0 = [at(1), carries(obj2), insof(obj1, obj2)], consc(Z0). q22f(Z0) :- Z0 = [at(1), insof(obj1, obj2)], consc(Z0).