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