package frama-c
Install
Dune Dependency
Authors
-
MMichele Alberti
-
TThibaud Antignac
-
GGergö Barany
-
PPatrick Baudin
-
NNicolas Bellec
-
TThibaut Benjamin
-
AAllan Blanchard
-
LLionel Blatter
-
FFrançois Bobot
-
RRichard Bonichon
-
VVincent Botbol
-
QQuentin Bouillaguet
-
DDavid Bühler
-
ZZakaria Chihani
-
LLoïc Correnson
-
JJulien Crétin
-
PPascal Cuoq
-
ZZaynah Dargaye
-
BBasile Desloges
-
JJean-Christophe Filliâtre
-
PPhilippe Herrmann
-
MMaxime Jacquemin
-
FFlorent Kirchner
-
AAlexander Kogtenkov
-
RRemi Lazarini
-
TTristan Le Gall
-
JJean-Christophe Léchenet
-
MMatthieu Lemerre
-
DDara Ly
-
DDavid Maison
-
CClaude Marché
-
AAndré Maroneze
-
TThibault Martin
-
FFonenantsoa Maurica
-
MMelody Méaulle
-
BBenjamin Monate
-
YYannick Moy
-
PPierre Nigron
-
AAnne Pacalet
-
VValentin Perrelle
-
GGuillaume Petiot
-
DDario Pinto
-
VVirgile Prevosto
-
AArmand Puccetti
-
FFélix Ridoux
-
VVirgile Robles
-
JJan Rochel
-
MMuriel Roger
-
JJulien Signoles
-
NNicolas Stouls
-
KKostyantyn Vorobyov
-
BBoris Yakobowski
Maintainers
Sources
sha256=d2fbb3b8d0ff83945872e9e6fa258e934a706360e698dae3b4d5f971addf7493
doc/frama-c-wp.core/Wp/Lang/F/QED/index.html
Module F.QED
Source
Loosely closed terms.
Non-structural, machine dependent, but fast comparison and efficient merges
Non-structural, machine dependent, but fast comparison and efficient merges
Structuraly ordered, but less efficient access and non-linear merges
Structuraly ordered, but less efficient access and non-linear merges
Variables
Terms
Constant time.
Constant time.
Computes equality
Constant time
Path-positioning access
This part of the API is DEPRECATED
position of a subterm in a term.
Basic constructors
Quantifiers and Binding
Bind the given variable if it appears free in the term, or return the term unchanged.
Opens the top-most bound variable with a (fresh) variable. Can be only applied on top-most lc-term from `Bind(_,_,_)`, thanks to typing.
val e_open :
pool:pool ->
?forall:bool ->
?exists:bool ->
?lambda:bool ->
term ->
(Qed.Logic.binder * var) list * term
Open all the specified binders (flags default to `true`, so all consecutive top most binders are opened by default). The pool must contain all free variables of the term.
Closes all specified binders
Generalized Substitutions
The environment sigma must be prepared with the desired substitution. Its pool of fresh variables must covers the entire domain and co-domain of the substitution, and the transformed values.
Locally Nameless Representation
These functions can be unsafe because they might expose terms that contains non-bound b-vars. Never use such terms to build substitutions (sigma).
Similar to f_iter
but exposes non-closed sub-terms of `Bind` as regular term
values instead of lc_term
ones.
Iteration Scheme
val f_map :
?pool:pool ->
?forall:bool ->
?exists:bool ->
?lambda:bool ->
(term -> term) ->
term ->
term
Pass and open binders, maps its direct sub-terms and then close then opened binders Raises Invalid_argument in case of a bind-term without pool. The optional pool must contain all free variables of the term.
val f_iter :
?pool:pool ->
?forall:bool ->
?exists:bool ->
?lambda:bool ->
(term -> unit) ->
term ->
unit
Iterates over its direct sub-terms (pass and open binders) Raises Invalid_argument in case of a bind-term without pool. The optional pool must contain all free variables of the term.
Partial Typing
val typeof :
?field:(Field.t -> tau) ->
?record:(Field.t -> tau) ->
?call:(Fun.t -> tau option list -> tau) ->
term ->
tau
Try to extract a type of term. Parameterized by optional extractors for field and functions. Extractors may raise Not_found
; however, they are only used when the provided kinds for fields and functions are not precise enough.
Support for Builtins
Register a simplifier for function f
. The computation code may raise Not_found
, in which case the symbol is not interpreted.
If f
is an operator with algebraic rules (see type operator
), the children are normalized before builtin call.
Highest priority is 0
. Recursive calls must be performed on strictly smaller terms.
The force
parameters defaults to false
, when it is true
, if there exist another builtin, it is replaced with the new one. Use with care.
Register a builtin for rewriting f a1..an
into f b1..bm
.
This is short cut for set_builtin
, where the head application of f
avoids to run into an infinite loop.
The force
parameters defaults to false
, when it is true
, if there exist another builtin, it is replaced with the new one. Use with care.
set_builtin_get f rewrite
register a builtin for rewriting (f a1..an)[k1]..[km]
into rewrite (a1..an) (k1..km)
.
The force
parameters defaults to false
, when it is true
, if there exist another builtin, it is replaced with the new one. Use with care.
Register a builtin for simplifying (f e…).fd
expressions. Must only use recursive comparison for strictly smaller terms.
The force
parameters defaults to false
, when it is true
, if there exist another builtin, it is replaced with the new one. Use with care.
Register a builtin equality for comparing any term with head-symbol. Must only use recursive comparison for strictly smaller terms. The recognized term with head function symbol is passed first.
Highest priority is 0
. Recursive calls must be performed on strictly smaller terms.
The force
parameters defaults to false
, when it is true
, if there exist another builtin, it is replaced with the new one. Use with care.
Register a builtin for comparing any term with head-symbol. Must only use recursive comparison for strictly smaller terms. The recognized term with head function symbol can be on both sides. Strict comparison is automatically derived from the non-strict one.
Highest priority is 0
. Recursive calls must be performed on strictly smaller terms.
The force
parameters defaults to false
, when it is true
, if there exist another builtin, it is replaced with the new one. Use with care.
Specific Patterns
Knowing h
, consequence h a
returns b
such that h -> (a<->b)
Symbol
Utilities
internal id
head symbol with children id's
head symbol with children id's
Shared sub-terms
Occurrence check. is_subterm a b
returns true
iff a
is a subterm of b
. Optimized wrt shared subterms, term size, and term variables.
Computes the sub-terms that appear several times. shared marked linked e
returns the shared subterms of e
.
The list of shared subterms is consistent with order of definition: each trailing terms only depend on heading ones.
The traversal is controlled by two optional arguments:
shared
those terms are not traversed (considered as atomic, default to none)shareable
those terms (is_simple
excepted) that can be shared (default to all)subterms
those sub-terms a term to be considered during traversal (lc_iter
by default)
Low-level shared primitives: shared
is actually a combination of building marks, marking terms, and extracting definitions:
let share ?... e =
let m = marks ?... () in
List.iter (mark m) es ;
defs m
Create a marking accumulator. Same defaults than shared
.
Mark a term to be explicitly shared