Module Gil_syntax.SLCmd
type t = | Fold of string * Expr.t list * (string * (string * Expr.t) list) option(*Fold predicate
*)| Unfold of string * Expr.t list * (string * string) list option * bool(*Unfold predicate
*)| Package of{}(*Magic wand packaging
*)| GUnfold of string(*Global Unfold
*)| ApplyLem of string * Expr.t list * string list(*Apply lemma
*)| SepAssert of Asrt.t * string list(*Assert
*)| Invariant of Asrt.t * string list(*Invariant
*)| Consume of Asrt.t * string list| Produce of Asrt.t| SymbExec
val pp_folding_info : (string * (string * Expr.t) list) option Fmt.tPretty-printer of folding info
val pp : Stdlib.Format.formatter -> t -> unitPretty-printer
Predicate actions
Some SLCmds are just syntactic sugar for special actions to be executed from the memory. For legacy reason, we have an encoding and decoding from one to the other.
We reserve these memory-action name: each carries Asrt.user_pred_prefix. The interpreter issues Fold, Unfold, GUnfold and Package as calls to these actions instead of through evaluate_slcmd.
Reserved action asking the predicate-carrying memory to recover from a failure by folding/unfolding; its arguments encode a recovery tactic (fold values or none; unfold values or none; "low"/"high"). It does not correspond to any SL command.
is_pred_action a holds iff a is one of the reserved actions above.
to_action c encodes a predicate-manipulating command as (action_name, args), or None for any other command (those are still handled by evaluate_slcmd). The arguments are left unevaluated (as they are syntactically matched against later).