AnalysisInterface between strategy and low-level analysis
An analysis distinguishes exactly one system as the top system, and looks at its properties and its contract. Subsystems are view either as abstract with their contract or as concrete with their implementations.
The result of an analysis indicates which properties of the top system are invariant, whether the system conforms to its contract and whether it conforms to the preconditions of all its subsystems.
Values of type param are produced by a strategy and parameterize the input-specific transitions system generators, in particular the slicing ot the cone of influence.
Values of type result are produced by running an analysis of a generated transition system. The accumulated results are used by a strategey to decide the next steps.
NB: The uid stored in an info must be unique because it is used during transition system generation to avoid name clashes in UFs and svars.
type assumptions = Invs.t Scope.Map.tType of scope-wise assumptions.
val assumptions_empty : assumptionsEmpty assumptions.
val assumptions_merge : assumptions -> assumptions -> assumptionsMerges two assumptions.
val assumptions_of_sys : TransSys.t -> assumptionsAssumptions of a transition system.
val assumptions_fold :
('a -> Scope.t -> Invs.t -> 'a) ->
'a ->
assumptions ->
'aFold over assumptions.
type info = {top : Scope.t;The top system for the analysis run
*)uid : int;UID for the analysis.
*)abstraction_map : bool Scope.Map.t;Systems flagged true are to be represented abstractly, those flagged false are to be represented by their implementation.
assumptions : assumptions;Properties that can be assumed invariant in subsystems
*)unrollings : int Scope.Map.t;The number of times the body of each recursive function is unrolled along a chain of recursive calls, once when the function is not in the map. In a compositional analysis, the calls past the unrollings are abstracted by the contract of the function, and a refinement adds an unrolling (see Strategy); in any other analysis they are left unconstrained, and an unrolling is added when a counterexample reaches one (see RecUnrolling).
terminating : Lib.position list Scope.Map.t;The recursive functions whose own analysis proved valid every termination check it had, each with the positions of the calls of those checks, which are looked up by call: a call whose checks the analysis did not have is not taken as terminating. In a compositional and modular analysis, a call to one of them at constant arguments is evaluated, and its value given to the solver, when the checks of all its recursive calls are among them (see LustreTransSys).
learned : (UfSymbol.t * Term.t list * Term.t) list;Values of calls to recursive functions, each a functional symbol of an output of the function with the concrete arguments of the call and its value, that earlier analyses of the top system evaluated while checking their counterexamples, which these values showed to be spurious (see RecUnrolling.check_abstractions). Those of the functions proved terminating (see terminating) are given to the solver as facts (see LustreTransSys), so that a refinement knows them without unrolling the functions as deep as the calls go.
}Information for the creation of a transition system
val shrink_info_to_sys : info -> TransSys.t -> infoShrinks an abstraction map to the subsystems of a system.
and result = {param : param;Parameters of the analysis.
*)time : float;Runtime of the analysis.
*)sys : TransSys.t;System analyzed, contains property statuses and invariants.
*)contract_valid : bool option;None if system analyzed has not contracts, Some true if it does and they have been proved correct, Some false if it does and some are unknown / falsified.
requirements_valid : bool option;None if system analyzed has not sub-requirements, Some true if it does and they have been proved correct, Some false if it does and some are unknown / falsified.
genuine : string list;The properties falsified by a counterexample that the recursive functions as they are violate, rather than their contracts that abstract them in the system (see RecUnrolling.check_abstractions): refining the recursive functions cannot prove them.
learned : (UfSymbol.t * Term.t list * Term.t) list;The values of calls to recursive functions that the checks of the counterexamples of the analysis evaluated, when they showed a counterexample to be spurious (see info.learned).
}Result of analysing a transistion system
val shrink_param_to_sys : param -> TransSys.t -> paramShrinks a param to a system.
Return true if a scope is flagged as abstract in the abstraction_map of a param. Default to false if the node is not in the map.
The number of unrollings of a recursive function in the analysis of a param, if a refinement set one (see info)
val no_system_is_abstract : ?include_top:bool -> param -> boolReturn true if no system is flagged abstract in the abstraction_map of a param.
Retrieve the assumptions of a scope from a param.
val mk_result :
?genuine:string list ->
?learned:(UfSymbol.t * Term.t list * Term.t) list ->
param ->
TransSys.t ->
float ->
resultReturns a result from an analysis.
val result_is_all_proved : result -> boolReturns true if all properties in the system in a result have been proved.
val result_is_all_inv_proved : result -> boolReturns true if all invariant properties in the system in a result have been proved.
val result_is_contract_proved : result -> boolReturns true if the contract of the system in a result was proved: every guarantee and mode property is valid, and so is every termination check of the system, when it is a recursive function. What a refinement of a caller needs of the system (see Strategy).
val result_is_termination_proved : result -> boolReturns true if every termination check of the system in a result was proved valid. The system of a function that is not recursive has none.
val result_termination_checks : result -> Lib.position list optionThe positions of the calls whose termination checks the analysis of a result proved, if it proved every termination check of the system, None otherwise
val result_is_some_falsified : result -> boolReturns true if some properties in the system in a result have been falsified.
val result_is_some_inv_falsified : result -> boolReturns true if some invariant properties in the system in a result have been falsified.
val result_is_some_reach_proved : result -> boolReturns true if some reachability properties in the system in a result have been proven reachable.
val mk_results : unit -> resultsCreates a new results.
Returns the list of results for a top scope.
Raises Not_found if not found.
val results_size : results -> intReturns the total number of analyzed systems so far
val results_length : results -> intReturns the total number of results stored in a results. Used to generate UIDs for params.
val results_is_safe : results -> bool optionReturns None if no properties were falsified but some could not be proved, Some true if all properties were proved, and Some false if some were falsified.
val results_is_empty : results -> boolCleans the results by removing nodes that don't have any property or contract.
type pp_print_system_user_name = Stdlib.Format.formatter -> Scope.t -> unitval pp_print_param :
bool ->
TransSys.t ->
pp_print_system_user_name ->
Stdlib.Format.formatter ->
param ->
unitPretty printer for param.
val pp_print_result_quiet :
pp_print_system_user_name ->
Stdlib.Format.formatter ->
result ->
unitPretty printer for result, quiet version.
val pp_print_result :
pp_print_system_user_name ->
Stdlib.Format.formatter ->
result ->
unitPretty printer for result.