Skip to content

Commit

Permalink
Add atom fact. Represent constant as function. Add external fact.
Browse files Browse the repository at this point in the history
  • Loading branch information
namcsi committed Jun 23, 2023
1 parent da9f0bc commit a8f9451
Show file tree
Hide file tree
Showing 16 changed files with 263 additions and 175 deletions.
1 change: 1 addition & 0 deletions src/renopro/asp/encodings/transform.lp
Original file line number Diff line number Diff line change
Expand Up @@ -6,6 +6,7 @@ ast(constant(Id,Name)) :- constant(Id, Name).
ast(function(Id,Name,Args)) :- function(Id,Name,Args).
ast(term_tuple(Id,Pos,Element)) :- term_tuple(Id,Pos,Element).
ast(binary_operation(Id,Operator,Left,Right)) :- binary_operation(Id,Operator,Left,Right).
ast(atom(Id,Symbol)) :- atom(Id,Symbol).
ast(literal(Id,Sign,Function)) :- literal(Id,Sign,Function).
ast(literal_tuple(Id,Pos,Element)) :- literal_tuple(Id,Pos,Element).
ast(rule(Id,Head,Body)) :- rule(Id,Head,Body).
Expand Down
17 changes: 9 additions & 8 deletions src/renopro/asp/tests/reify/binary_operation.lp
Original file line number Diff line number Diff line change
Expand Up @@ -4,14 +4,15 @@

program("base",constant_tuple(0),statement_tuple(1)).
statement_tuple(1,0,rule(2)).
rule(2,literal(3),literal_tuple(10)).
rule(2,literal(3),literal_tuple(11)).
% facts representing head literal equal((1+1),2).
literal(3,"pos",function(4)).
function(4,equal,term_tuple(5)).
literal(3,"pos",atom(4)).
atom(4,function(5)).
function(5,equal,term_tuple(6)).
% facts representing the binary operation (1+1).
term_tuple(5,0,binary_operation(6)).
binary_operation(6,"+",number(7),number(8)).
number(7,1).
term_tuple(6,0,binary_operation(7)).
binary_operation(7,"+",number(8),number(9)).
number(8,1).
term_tuple(5,1,number(9)).
number(9,2).
number(9,1).
term_tuple(6,1,number(10)).
number(10,2).
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@

program("base",constant_tuple(0),statement_tuple(1)).
statement_tuple(1,0,rule(2)).
rule(2,literal(3),literal_tuple(7)).
rule(2,literal(3),literal_tuple(9)).
% facts representing head literal yummy("carrot").
literal(3,"pos",function(4)).
function(4,good,term_tuple(5)).
term_tuple(5,0,constant(6)).
constant(6,human).
literal(3,"pos",atom(4)).
atom(4,function(5)).
function(5,good,term_tuple(6)).
term_tuple(6,0,function(7)).
function(7,human,term_tuple(8)).
25 changes: 25 additions & 0 deletions src/renopro/asp/tests/reify/external.lp
Original file line number Diff line number Diff line change
@@ -0,0 +1,25 @@
% reified fact representation of program:
% #program base.
% #external a(X) : c(X); d(e(X)).

program("base",constant_tuple(0),statement_tuple(1)).
statement_tuple(1,0,external(2)).
external(2,atom(3),literal_tuple(7),false).
atom(3,function(4)).
function(4,a,term_tuple(5)).
term_tuple(5,0,variable(6)).
variable(6,"X").
literal_tuple(7,0,literal(8)).
literal(8,"pos",atom(9)).
atom(9,function(10)).
function(10,c,term_tuple(11)).
term_tuple(11,0,variable(12)).
variable(12,"X").
literal_tuple(7,1,literal(13)).
literal(13,"pos",atom(14)).
atom(14,function(15)).
function(15,d,term_tuple(16)).
term_tuple(16,0,function(17)).
function(17,e,term_tuple(18)).
term_tuple(18,0,variable(19)).
variable(19,"X").
30 changes: 16 additions & 14 deletions src/renopro/asp/tests/reify/function.lp
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,21 @@

program("base",constant_tuple(0),statement_tuple(1)).
statement_tuple(1,0,rule(2)).
rule(2,literal(3),literal_tuple(8)).
rule(2,literal(3),literal_tuple(9)).
% facts representing head literal rel(2,1).
literal(3,"pos",function(4)).
function(4,rel,term_tuple(5)).
term_tuple(5,0,number(6)).
number(6,2).
term_tuple(5,1,number(7)).
number(7,1).
literal(3,"pos",atom(4)).
atom(4,function(5)).
function(5,rel,term_tuple(6)).
term_tuple(6,0,number(7)).
number(7,2).
term_tuple(6,1,number(8)).
number(8,1).
% facts representing body literal rel(1,2).
literal_tuple(8,0,literal(9)).
literal(9,"pos",function(10)).
function(10,rel,term_tuple(11)).
term_tuple(11,0,number(12)).
number(12,1).
term_tuple(11,1,number(13)).
number(13,2).
literal_tuple(9,0,literal(10)).
literal(10,"pos",atom(11)).
atom(11,function(12)).
function(12,rel,term_tuple(13)).
term_tuple(13,0,number(14)).
number(14,1).
term_tuple(13,1,number(15)).
number(15,2).
15 changes: 8 additions & 7 deletions src/renopro/asp/tests/reify/nested_function.lp
Original file line number Diff line number Diff line change
Expand Up @@ -4,11 +4,12 @@

program("base",constant_tuple(0),statement_tuple(1)).
statement_tuple(1,0,rule(2)).
rule(2,literal(3),literal_tuple(9)).
rule(2,literal(3),literal_tuple(11)).
% facts representing head literal rel(2,1).
literal(3,"pos",function(4)).
function(4,next,term_tuple(5)).
term_tuple(5,0,function(6)).
function(6,move,term_tuple(7)).
term_tuple(7,0,constant(8)).
constant(8,a).
literal(3,"pos",atom(4)).
atom(4,function(5)).
function(5,next,term_tuple(6)).
term_tuple(6,0,function(7)).
function(7,move,term_tuple(8)).
term_tuple(8,0,function(9)).
function(9,a,term_tuple(10)).
7 changes: 4 additions & 3 deletions src/renopro/asp/tests/reify/prop_fact.lp
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,8 @@

program("base",constant_tuple(0),statement_tuple(1)).
statement_tuple(1,0,rule(2)).
rule(2,literal(3),literal_tuple(5)).
rule(2,literal(3),literal_tuple(7)).
% facts representing head literal a.
literal(3,"pos",constant(4)).
constant(4,a).
literal(3,"pos",atom(4)).
atom(4,function(5)).
function(5,a,term_tuple(6)).
21 changes: 12 additions & 9 deletions src/renopro/asp/tests/reify/prop_normal_rule.lp
Original file line number Diff line number Diff line change
Expand Up @@ -4,15 +4,18 @@

program("base",constant_tuple(0),statement_tuple(1)).
statement_tuple(1,0,rule(2)).
rule(2,literal(3),literal_tuple(5)).
rule(2,literal(3),literal_tuple(7)).
% facts representing head literal a.
literal(3,"pos",constant(4)).
constant(4,a).
literal(3,"pos",atom(4)).
atom(4,function(5)).
function(5,a,term_tuple(6)).
% facts representing body literal b.
literal_tuple(5,0,literal(6)).
literal(6,"pos",constant(7)).
constant(7,b).
literal_tuple(7,0,literal(8)).
literal(8,"pos",atom(9)).
atom(9,function(10)).
function(10,b,term_tuple(11)).
% facts representing body literal not c.
literal_tuple(5,1,literal(8)).
literal(8,"not",constant(9)).
constant(9,c).
literal_tuple(7,1,literal(12)).
literal(12,"not",atom(13)).
atom(13,function(14)).
function(14,c,term_tuple(15)).
11 changes: 6 additions & 5 deletions src/renopro/asp/tests/reify/string.lp
Original file line number Diff line number Diff line change
Expand Up @@ -4,9 +4,10 @@

program("base",constant_tuple(0),statement_tuple(1)).
statement_tuple(1,0,rule(2)).
rule(2,literal(3),literal_tuple(7)).
rule(2,literal(3),literal_tuple(8)).
% facts representing head literal yummy("carrot").
literal(3,"pos",function(4)).
function(4,yummy,term_tuple(5)).
term_tuple(5,0,string(6)).
string(6,"carrot").
literal(3,"pos",atom(4)).
atom(4,function(5)).
function(5,yummy,term_tuple(6)).
term_tuple(6,0,string(7)).
string(7,"carrot").
34 changes: 18 additions & 16 deletions src/renopro/asp/tests/reify/variable.lp
Original file line number Diff line number Diff line change
Expand Up @@ -4,19 +4,21 @@

program("base",constant_tuple(0),statement_tuple(1)).
statement_tuple(1,0,rule(2)).
rule(2,literal(3),literal_tuple(8)).
% facts representing head literal rel(2,1).
literal(3,"pos",function(4)).
function(4,rel,term_tuple(5)).
term_tuple(5,0,variable(6)).
variable(6,"Y").
term_tuple(5,1,variable(7)).
variable(7,"X").
% facts representing body literal rel(1,2).
literal_tuple(8,0,literal(9)).
literal(9,"pos",function(10)).
function(10,rel,term_tuple(11)).
term_tuple(11,0,variable(12)).
variable(12,"X").
term_tuple(11,1,variable(13)).
variable(13,"Y").
rule(2,literal(3),literal_tuple(9)).
% facts representing head literal rel(Y,X).
literal(3,"pos",atom(4)).
atom(4,function(5)).
function(5,rel,term_tuple(6)).
term_tuple(6,0,variable(7)).
variable(7,"Y").
term_tuple(6,1,variable(8)).
variable(8,"X").
% facts representing body literal rel(X,Y).
literal_tuple(9,0,literal(10)).
literal(10,"pos",atom(11)).
atom(11,function(12)).
function(12,rel,term_tuple(13)).
term_tuple(13,0,variable(14)).
variable(14,"X").
term_tuple(13,1,variable(15)).
variable(15,"Y").
17 changes: 10 additions & 7 deletions src/renopro/asp/tests/transform/not_bad/transform.lp
Original file line number Diff line number Diff line change
Expand Up @@ -13,15 +13,18 @@
% ->
% good(dog(X,"spotty")) :- cute(dog(X,"spotty")), not bad(dog(X,"spotty")).

% auxiliary predicate to get maximal index within a tuple
max_index(I,N) :- N = #max{ P : literal_tuple(I,P,_); -1 }, literal_tuple(I,_,_).
% auxiliary predicate to get maximal index within a tuple of rule body literals
max_lit_index(LT,Idx)
:- Idx = #max{ P : literal_tuple(LT,P,_); -1 }, rule(_,_,literal_tuple(LT)).


% the transformation itself
add((literal_tuple(LT,N+1,literal(new_id(LT,0))));
literal(new_id(LT,0),"not",function(new_id(LT,1)));
function(new_id(LT,1),bad,Fargs))
add((literal_tuple(LT,N+1,literal(new_id(LT,0)));
literal(new_id(LT,0),"not",atom(new_id(LT,1)));
atom(new_id(LT,1),function(new_id(LT,2)));
function(new_id(LT,2),bad,Fargs)))
:- rule(_,literal(L),literal_tuple(LT)),
literal(L,"pos",function(F)),
literal(L,"pos",atom(A)),
atom(A,function(F)),
function(F,good,Fargs),
max_index(LT,N).
max_lit_index(LT,N).
90 changes: 38 additions & 52 deletions src/renopro/asp/tests/transform/prev_to_timepoints/transform.lp
Original file line number Diff line number Diff line change
@@ -1,61 +1,47 @@
% auxiliary atoms
max_index(T,Index) :- Index = #max{ Pos : term_tuple(T,Pos,_); -1 }, term_tuple(T,_,_).
arity(F,N+1) :- function(F,_,term_tuple(T)), max_index(T,N).
max_arg_index(TT,Idx)
:- Idx = #max{ Pos : term_tuple(TT,Pos,_); -1 }, function(_,_,term_tuple(TT)).

arity(F,N+1) :- function(F,_,term_tuple(T)), max_arg_index(T,N).

% when a literal is not prev
prev_chain(A,function(F),O)
:- atom(A,function(F)), function(F,prev,term_tuple(T)), arity(F,1),
term_tuple(T,0,O).

% when atom of a literal is a predicate
add((term_tuple(T,N+1,constant(new_id(T)));
constant(new_id(T),t)))
:- literal(L,_,function(F)), function(F,Name,term_tuple(T)),
Name!=prev, max_index(T,N).
prev_chain(A,function(F),O)
:- prev_chain(A,_,function(F)), function(F,prev,term_tuple(T)), arity(F,1),
term_tuple(T,0,O).

% when atom of a literal is a propositional constant
delete(literal(L,S,constant(F))) :- literal(L,S,constant(F)).
add((literal(L,S,function(F));
function(F,Name,term_tuple(new_id(F)));
term_tuple(new_id(F),0,constant(new_id(F)));
constant(new_id(F),t)))
:- literal(L,S,constant(F)), constant(F,Name).
% final operand must be a constant or function, as e.g. prev(1) is not a prev operation
final_operand(A,O)
:- prev_chain(A,F,O), not prev_chain(A,O,_),
O=function(_).

num_prevs(A,N) :- N = #count{ F : prev_chain(A,F,_) }, prev_chain(A,_,_).

prev_chain(L,function(F),O)
:- literal(L,_,function(F)), function(F,prev,term_tuple(T)), arity(F,1),
term_tuple(T,0,O).
first_prev(A,F) :- prev_chain(A,F,O), not prev_chain(A,_,F).

prev_chain(L,function(F),O)
:- prev_chain(L,_,function(F)), function(F,prev,term_tuple(T)), arity(F,1),
term_tuple(T,0,O).

final_operand(L,O)
:- prev_chain(L,F,O), not prev_chain(L,O,_), O=(constant(_);function(_)).

first_prev(L,F)
:- prev_chain(L,F,O), not prev_chain(L,_,F).

num_prevs(L,N)
:- N = #count{ F : prev_chain(L,F,_) }, prev_chain(L,_,_).

% when final operand is a function
replace(function(F,N,A),function(F,Name,term_tuple(T)))
:- first_prev(L,function(F)), function(F,N,A), final_operand(L,function(O)),
function(O,Name,term_tuple(T)).

add(term_tuple(T,I+1,binary_operation(new_id(O)));
binary_operation(new_id(O),"-",constant(new_id(O)),number(new_id(O)));
constant(new_id(O),t);
number(new_id(O),N))
:- final_operand(L,function(O)), function(O,_,term_tuple(T)), max_index(T,I),
num_prevs(L,N).

% when final operand is a constant
replace(function(F,N,A),function(F,Name,term_tuple(new_id(O))))
:- first_prev(L,function(F)), function(F,N,A), final_operand(L,constant(O)),
constant(O,Name).

add(term_tuple(new_id(O),0,binary_operation(new_id(O)));
binary_operation(new_id(O),"-",constant(new_id(O)),number(new_id(O)));
constant(new_id(O),t);
number(new_id(O),N))
:- final_operand(L,constant(O)), num_prevs(L,N).
% when an atom is not prev.

% add time point constant as additional argument
add(term_tuple(T,N+1,function(new_id(T)));
function(new_id(T),t,term_tuple(new_id(T))))
:- atom(A,function(F)), function(F,Name,term_tuple(T)),
Name!=prev, max_arg_index(T,N).

% when an atom is a prev.

% replace function symbol of atom with final operand, appending
% appropriate time point as additional argument.
replace(function(F,N,T1),function(F,Name,term_tuple(T2)))
:- first_prev(A,function(F)), function(F,N,T1), final_operand(A,function(O)),
function(O,Name,term_tuple(T2)).

add((term_tuple(T,I+1,binary_operation(new_id(O)));
binary_operation(new_id(O),"-",function(new_id(O)),number(new_id(O)));
function(new_id(O),t,term_tuple(new_id(O)));
number(new_id(O),N)))
:- final_operand(A,function(O)), function(O,_,term_tuple(T)), max_arg_index(T,I),
num_prevs(A,N).

Original file line number Diff line number Diff line change
@@ -1 +1 @@
very_sad(robot(X)) :- prev(sad(robot(X))), prev(prev(sad(robot(X)))).
very_sad(robot(X)) :- prev(sad(robot(X))), prev(prev(sad(robot(X)))).
Loading

0 comments on commit a8f9451

Please sign in to comment.