cnf(and_definition,axiom,
    ( holds(and(X,Y),State)
    | ~ holds(X,State)
    | ~ holds(Y,State) ) ).

cnf(pickup_1,axiom,
    ( holds(holding(X),do(pickup(X),State))
    | ~ holds(empty,State)
    | ~ holds(clear(X),State)
    | ~ differ(X,table) ) ).

cnf(pickup_2,axiom,
    ( holds(clear(Y),do(pickup(X),State))
    | ~ holds(on(X,Y),State)
    | ~ holds(clear(X),State)
    | ~ holds(empty,State) ) ).

cnf(pickup_3,axiom,
    ( holds(on(X,Y),do(pickup(Z),State))
    | ~ holds(on(X,Y),State)
    | ~ differ(X,Z) ) ).

cnf(pickup_4,axiom,
    ( holds(clear(X),do(pickup(Z),State))
    | ~ holds(clear(X),State)
    | ~ differ(X,Z) ) ).

cnf(putdown_1,axiom,
    ( holds(empty,do(putdown(X,Y),State))
    | ~ holds(holding(X),State)
    | ~ holds(clear(Y),State) ) ).

cnf(putdown_2,axiom,
    ( holds(on(X,Y),do(putdown(X,Y),State))
    | ~ holds(holding(X),State)
    | ~ holds(clear(Y),State) ) ).

cnf(putdown_3,axiom,
    ( holds(clear(X),do(putdown(X,Y),State))
    | ~ holds(holding(X),State)
    | ~ holds(clear(Y),State) ) ).

cnf(putdown_4,axiom,
    ( holds(on(X,Y),do(putdown(Z,W),State))
    | ~ holds(on(X,Y),State) ) ).

cnf(putdown_5,axiom,
    ( holds(clear(Z),do(putdown(X,Y),State))
    | ~ holds(clear(Z),State)
    | ~ differ(Z,Y) ) ).

cnf(symmetry_of_differ,axiom,
    ( differ(X,Y)
    | ~ differ(Y,X) ) ).

cnf(differ_a_b,axiom,
    differ(a,b) ).

cnf(differ_a_c,axiom,
    differ(a,c) ).

cnf(differ_a_d,axiom,
    differ(a,d) ).

cnf(differ_a_table,axiom,
    differ(a,table) ).

cnf(differ_b_c,axiom,
    differ(b,c) ).

cnf(differ_b_d,axiom,
    differ(b,d) ).

cnf(differ_b_table,axiom,
    differ(b,table) ).

cnf(differ_c_d,axiom,
    differ(c,d) ).

cnf(differ_c_table,axiom,
    differ(c,table) ).

cnf(differ_d_table,axiom,
    differ(d,table) ).

%----Initial configuration
cnf(initial_state1,axiom,
    holds(on(a,table),s0) ).

cnf(initial_state2,axiom,
    holds(on(b,table),s0) ).

cnf(initial_state3,axiom,
    holds(on(c,d),s0) ).

cnf(initial_state4,axiom,
    holds(on(d,table),s0) ).

cnf(initial_state5,axiom,
    holds(clear(a),s0) ).

cnf(initial_state6,axiom,
    holds(clear(b),s0) ).

cnf(initial_state7,axiom,
    holds(clear(c),s0) ).

cnf(initial_state8,axiom,
    holds(empty,s0) ).

%----Table is always clear
cnf(clear_table,axiom,
    holds(clear(table),State) ).