detype_ast((_,Node),C,DetypedAST,NC) :-
detype_ast(Node,C,DetypedAST,NC).
detype_ast(int(Value),C,integer(C,Value),C).
detype_ast(string(Value),C,string(C,Value),C).
detype_ast(Bool,C,DetypedBool,C) :-
( Bool = pred_true ->
DetypedBool = boolean_true(C)
; Bool = pred_false ->
DetypedBool = boolean_false(C)).
detype_ast(b(integer(Value),_,_),C,integer(C,Value),C).
detype_ast(b(string(Value),_,_),C,string(C,Value),C).
detype_ast(b(Node,_,_),C,DetypedAST,C) :-
functor(Node, _, 0) ,
DetypedAST =.. [Node,C].
detype_ast(field(Name,ValueNode),C,rec_entry(C,identifier(C1,Name),DetypedValueNode),NC) :-
C1 is C + 1 ,
C2 is C1 + 1 ,
detype_ast(ValueNode,C2,DetypedValueNode,NC).
detype_ast(b(identifier(Name),_,_),C,identifier(C,Name),C).
detype_ast(b(Node,_,_),C,DetypedAST,NC) :-
Node =.. [NodeType,Arg] ,
avl_to_list_set(Arg,NArg) ,
(NodeType = sequence_extension ; (NodeType = value , NArg = [(_,_)|_])) ,
C1 is C + 1 ,
detype_set(NArg,C1,DetypedArg,NC) ,
% use 'sequence_extension' instead of 'value' for detyped ASTs
DetypedAST = sequence_extension(C,DetypedArg).
detype_ast(b(Node,_,_),C,DetypedAST,NC) :-
Node =.. [NodeType,Arg] ,
(NodeType = set_extension ; NodeType = value) ,
avl_to_list_set(Arg,NArg) ,
C1 is C + 1 ,
detype_set(NArg,C1,DetypedArg,NC) ,
% use 'set_extension' instead of 'value' for detyped ASTs
DetypedAST = set_extension(C,DetypedArg).
detype_ast(b(rec(FieldList),_,_),C,rec(C,DetypedFieldList),NC) :-
C1 is C + 1 ,
detype_set(FieldList,C1,DetypedFieldList,NC).
detype_ast(b(exists(IDList,Predicate),_,_),C,exists(C,DetypedIDList,DetypedPredicate),NC) :-
C1 is C + 1 ,
detype_set(IDList,C1,DetypedIDList,TempC) ,
C2 is TempC + 1 ,
detype_ast(Predicate,C2,DetypedPredicate,NC).
detype_ast(b(forall(IDList,LHS,RHS),_,_),C,forall(C,DetypedIDList,implication(ImpC,DetypedLHS,DetypedRHS)),NC) :-
C1 is C + 1 ,
detype_set(IDList,C1,DetypedIDList,TempC) ,
ImpC is TempC + 1 ,
C2 is ImpC + 1 ,
detype_ast(LHS,C2,DetypedLHS,TempC2) ,
C3 is TempC2 + 1 ,
detype_ast(RHS,C3,DetypedRHS,NC).
detype_ast(b(Node,_,_),C,DetypedAST,NC) :-
Node =.. [NodeType,Arg] ,
C1 is C + 1 ,
detype_ast(Arg,C1,DetypedArg,NC) ,
DetypedAST =.. [NodeType,C,DetypedArg].
detype_ast(b(Node,_,_),C,DetypedAST,NC) :-
Node =.. [NodeType,Arg1,Arg2] ,
C1 is C + 1 ,
detype_ast(Arg1,C1,DetypedArg1,TempC) ,
C2 is TempC + 1 ,
detype_ast(Arg2,C2,DetypedArg2,NC) ,
DetypedAST =.. [NodeType,C,DetypedArg1,DetypedArg2].