% OCTOPUS Axioms in Prolog % Action Precondition Axioms. poss(startMove(H,X,Y,T,T1),S) :- start(S,T), clear(X,S), clear(Y,S), not X = Y, not reserved(X,S), not reserved(Y,S), hand(H), not handInUse(H,S), moveDuration(H,X,Y,S,D), T1 is T + D. poss(startMoveToTable(H,X,T,T1),S) :- start(S,T), clear(X,S), not ontable(X,S), not reserved(X,S), hand(H), not handInUse(H,S), moveToTableDuration(H,X,S,D), T1 is T + D. poss(endMove(H,X,Y,T,T1),S) :- moving(H,X,Y,T,T1,S), precedesActiveProcessTerminationTimes(T1,S). poss(endMoveToTable(H,X,T,T1),S) :- movingToTable(H,X,T,T1,S), precedesActiveProcessTerminationTimes(T1,S). % Successor State Axioms. clear(X,do(A,S)) :- (A = startMove(H,Y,Z,T,T1) ; A = startMoveToTable(H,Y,T,T1)), on(Y,X,S) ; A = endMove(H,X,Z,T,T1) ; A = endMoveToTable(H,X,T,T1) ; clear(X,S), not A = endMove(H,Y,X,T,T1), not A = startMove(H,X,Y,T,T1), not A = startMoveToTable(H,X,T,T1). on(X,Y,do(A,S)) :- A = endMove(H,X,Y,T,T1) ; on(X,Y,S), not A = startMoveToTable(H,X,T,T1), not A = startMove(H,X,Z,T,T1). ontable(X,do(A,S)) :- A = endMoveToTable(H,X,T,T1) ; ontable(X,S), not A = startMove(H,X,Y,T,T1). moving(H,X,Y,T,T1,do(A,S)) :- A = startMove(H,X,Y,T,T1) ; moving(H,X,Y,T,T1,S), not A = endMove(H,X,Y,T,T1). movingToTable(H,X,T,T1,do(A,S)) :- A = startMoveToTable(H,X,T,T1) ; movingToTable(H,X,T,T1,S), not A = endMoveToTable(H,X,T,T1). % Abbreviations. handInUse(H,S) :- moving(H,X,Y,T,T1,S), ! ; movingToTable(H,X,T,T1,S). reserved(Y,S) :- moving(H,X,Y,T,T1,S). precedesActiveProcessTerminationTimes(T,S) :- not ((moving(H,X,Y,T1,T2,S) ; movingToTable(H,X,T1,T2,S)), T > T2). % Primitive Action Declarations. primitive_action(startMove(H,X,Y,T,T1)). primitive_action(endMove(H,X,Y,T,T1)). primitive_action(startMoveToTable(H,X,T,T1)). primitive_action(endMoveToTable(H,X,T,T1)). % Action Start Times. time(startMove(H,X,Y,T,T1),T). time(endMove(H,X,Y,T,T1),T1). time(startMoveToTable(H,X,T,T1),T). time(endMoveToTable(H,X,T,T1),T1). % Situation Start Time. start(do(A,S),T) :- time(A,T).