1#script (lua)
2function main(prg)
3    prg:ground({{"base", {}}, {"plan_graph_base", {}}})
4
5    for step = 1,3,1 do
6        prg:ground({{"plan_graph_step", {step}}})
7        prg:solve()
8    end
9--  Comment line 8 and uncomment line 11
10--  prg:solve()
11end
12#end.
13
14#program plan_graph_base.
15valid_f(FLUENT, 1) :- init(FLUENT).
16valid_f1(FLUENT, 1) :- init(FLUENT).
17
18#program plan_graph_step(time).
19
20%Encoding 1
21
22valid_a(ACT, time) :- action(ACT); valid_f(FLUENT, time) : pre(ACT, FLUENT);
23            not mutex(F1, F2, time) : req_both(ACT, F1, F2).
24
25valid_pre(ACT, FLUENT, time) :- valid_a(ACT, time), pre(ACT, FLUENT).
26valid_add(ACT, FLUENT, time) :- valid_a(ACT, time), addadd(ACT, FLUENT).
27valid_f(FLUENT, time + 1) :- valid_add(_, FLUENT, time).
28
29mutex_actions(A1, A2, time) :- valid_a(A1, time), valid_a(A2, time), conflicting(A1, A2).
30
31mutex_a_with_f(A1, P2, time) :- mutex(P1, P2, time), valid_pre(A1, P1, time).
32mutex_actions(A1, A2, time) :- mutex_a_with_f(A1, P2, time), valid_pre(A2, P2, time).
33%mutex_actions(A1, A2, time) :- mutex(P1, P2, time), valid_pre(A1, P1, time), valid_pre(A2, P2, time).
34
35mutex_a_sym(A1, A2, time; A2, A1, time) :- mutex_actions(A1, A2, time).
36
37closes(A2, F1, time) :- valid_a(A2, time), valid_f(F1, time+1); mutex_a_sym(A1, A2, time) : valid_add(A1, F1, time).
38mutex(F1, F2, time+1) :- F1 < F2, valid_f(F1, time+1), valid_f(F2, time+1);
39            closes(A2, F1, time) : valid_add(A2, F2, time).
40
41% Encoding 2:
42% Identical to encoding 1 except for lines 32 and 33 vs. line 57.
43% However these should generate identical groundings, but they don't for some reason
44
45valid_a1(ACT, time) :- action(ACT); valid_f1(FLUENT, time) : pre(ACT, FLUENT);
46            not mutex1(F1, F2, time) : req_both(ACT, F1, F2).
47
48valid_pre1(ACT, FLUENT, time) :- valid_a1(ACT, time), pre(ACT, FLUENT).
49valid_add1(ACT, FLUENT, time) :- valid_a1(ACT, time), addadd(ACT, FLUENT).
50valid_f1(FLUENT, time + 1) :- valid_add1(_, FLUENT, time).
51
52mutex_actions1(A1, A2, time) :- valid_a1(A1, time), valid_a1(A2, time), conflicting(A1, A2).
53
54%mutex_a_with_f1(A1, P2, time) :- mutex1(P1, P2, time), valid_pre1(A1, P1, time).
55%mutex_actions1(A1, A2, time) :- mutex_a_with_f1(A1, P2, time), valid_pre1(A2, P2, time).
56mutex_actions1(A1, A2, time) :- mutex1(P1, P2, time), valid_pre1(A1, P1, time), valid_pre1(A2, P2, time).
57
58mutex_a_sym1(A1, A2, time; A2, A1, time) :- mutex_actions1(A1, A2, time).
59
60closes1(A2, F1, time) :- valid_a1(A2, time), valid_f1(F1, time+1); mutex_a_sym1(A1, A2, time) : valid_add1(A1, F1, time).
61mutex1(F1, F2, time+1) :- F1 < F2, valid_f1(F1, time+1), valid_f1(F2, time+1);
62            closes1(A2, F1, time) : valid_add1(A2, F2, time).
63
64% diff reports if the two encodings are not the same
65
66diff(A1, A2, time) :- mutex_actions1(A1, A2, time), not mutex_actions(A1, A2, time).
67diff(A1, A2, time) :- mutex_actions(A1, A2, time), not mutex_actions1(A1, A2, time).
68
69#program base.
70
71#show diff/3.
72
73preserve_action(preserve(F)) :- fact(F).
74action(A) :- preserve_action(A).
75pre(preserve(F), F) :- fact(F).
76addadd(preserve(F), F) :- fact(F).
77
78prepre(A, F) :- pre(A, F), not del(A, F).
79deldel(A, F) :- del(A, F), not pre(A, F).
80predel(A, F) :- pre(A, F), del(A, F).
81addadd(A, F) :- add(A, F), not pre(A, F), not del(A, F).
82
83conflicting(A1, A2) :- pre(A1, F), del(A2, F), A1 != A2.
84
85req_both(ACT, F1, F2) :- pre(ACT, F1), pre(ACT, F2), F1 < F2.
86
87type(object).
88type(ferry, object).
89fact(at_ferry(X)) :- type(X, object).
90fact(at(X, Y)) :- type(X, object), type(Y, object).
91fact(on(X, Y)) :- type(X, object), type(Y, object).
92fact(empty_ferry).
93action(debark(X, Y)) :- type(X, object), type(Y, object), auto__(X), place__(Y).
94pre(debark(X, Y), on(X, ferry)) :- action(debark(X, Y)).
95pre(debark(X, Y), at_ferry(Y)) :- action(debark(X, Y)).
96add(debark(X, Y), at(X, Y)) :- action(debark(X, Y)).
97add(debark(X, Y), empty_ferry) :- action(debark(X, Y)).
98del(debark(X, Y), on(X, ferry)) :- action(debark(X, Y)).
99action(sail(X, Y)) :- type(X, object), type(Y, object), place__(X), place__(Y).
100pre(sail(X, Y), at_ferry(X)) :- action(sail(X, Y)).
101add(sail(X, Y), at_ferry(Y)) :- action(sail(X, Y)).
102del(sail(X, Y), at_ferry(X)) :- action(sail(X, Y)).
103action(board(X, Y)) :- type(X, object), type(Y, object), place__(Y), auto__(X).
104pre(board(X, Y), at(X, Y)) :- action(board(X, Y)).
105pre(board(X, Y), at_ferry(Y)) :- action(board(X, Y)).
106pre(board(X, Y), empty_ferry) :- action(board(X, Y)).
107add(board(X, Y), on(X, ferry)) :- action(board(X, Y)).
108del(board(X, Y), at(X, Y)) :- action(board(X, Y)).
109del(board(X, Y), empty_ferry) :- action(board(X, Y)).
110type(c1, object).
111type(b, object).
112type(c2, object).
113type(a, object).
114place__(a).
115place__(b).
116auto__(c1).
117auto__(c2).
118init(at(c1, a)).
119init(at(c2, a)).
120init(at_ferry(a)).
121init(empty_ferry).
122goal(at(c1, b)).
123goal(at(c2, b)).
124
125