Description:
unparsed_ap(ap(P),ap(P)) --> !.
unparsed_ap(action(unparsed_b(OpName/Arity/Types,Exprs)),action(b(OpName/Arity,Es))) --> !,
add_unparsed_exprs(Exprs,Types,Es).
unparsed_ap(action(b(OpName/Arity/_Types)),action(b(OpName/Arity))) --> !.
unparsed_ap(action(Op),action(Op)) --> !.
unparsed_ap(unparsed(Unparsed),ap(P)) --> !,[pred(Unparsed,P)].
unparsed_ap(F,N) --> {F =..[Functor|Args]},unparsed_ap_l(Args,NArgs),{N=..[Functor|NArgs]}.
unparsed_ap_l([],[]) --> [].
unparsed_ap_l([F|Rest],[N|NRest]) --> unparsed_ap(F,N), unparsed_ap_l(Rest,NRest).
add_unparsed_exprs([],[],[]) --> [].
add_unparsed_exprs([expr(P,U)|UR],[T|TR],[expr(P,E)|ER]) -->
[expr(U,T,E)], add_unparsed_exprs(UR,TR,ER).
Description:
in case of [evt], 'evt' will be recognised as visible
Description:
Predicates for determining which actions are visible and which are stutter in regard to the given LTL formula.
An operation Op in a B machine should be identified as visible for a given LTL formula f, if Op writes variables used
in the predicates in f or writes variables read in guard of operations inside the e(-) atoms in f.
In case the respective LTL formula f contains a X (next) operator then M_{POR} |= f and M |= f are not equivalent.
It is not clear how to handle LTL formulae containing transition propositions ([-]). (investigate e.g. LTL formulae of the form: ([Op] => g))