diff options
| author | Alasdair Armstrong | 2018-07-24 18:09:18 +0100 |
|---|---|---|
| committer | Alasdair Armstrong | 2018-07-24 18:09:18 +0100 |
| commit | 6b4f407ad34ca7d4d8a89a5a4d401ac80c7413b0 (patch) | |
| tree | ed09b22b7ea4ca20fbcc89b761f1955caea85041 /language | |
| parent | dafb09e7c26840dce3d522fef3cf359729ca5b61 (diff) | |
| parent | 8114501b7b956ee4a98fa8599c7efee62fc19206 (diff) | |
Merge remote-tracking branch 'origin/sail2' into c_fixes
Diffstat (limited to 'language')
| -rw-r--r-- | language/Makefile | 54 | ||||
| -rw-r--r-- | language/l2_parse.ott | 1407 | ||||
| -rw-r--r-- | language/l2_parse2.ott | 1424 | ||||
| -rw-r--r-- | language/l2_rules.ott | 424 | ||||
| -rw-r--r-- | language/l2_terminals_non_tt.ott | 31 | ||||
| -rw-r--r-- | language/l2_terminals_tt.ott | 31 | ||||
| -rw-r--r-- | language/l2_typ.ott | 382 | ||||
| -rw-r--r-- | language/primitive_doc.ott | 130 | ||||
| -rw-r--r-- | language/type_system.tex | 117 |
9 files changed, 0 insertions, 4000 deletions
diff --git a/language/Makefile b/language/Makefile deleted file mode 100644 index 759523b7..00000000 --- a/language/Makefile +++ /dev/null @@ -1,54 +0,0 @@ -#OTT=../../../rsem/ott/bin/ott -# this is the binary that gets rebuilt by make in ott/src: -OTT=../../ott/src/ott -OTTLIB=$(dir $(shell which ott))../hol - -.PHONY: all -all: l2.ml l2_parse.ml l2.lem l2_parse2.ml l2_parse2_parser.mly - -docs: l2.pdf l2_parse.pdf - -%.pdf: %.tex - pdflatex $< - -%Theory.uo: %Script.sml - Holmake --qof -I $(OTTLIB) $@ - -type_system.pdf: doc_in.tex type_system.tex - pdflatex type_system.tex - pdflatex type_system.tex - -l2.tex: l2.ott l2_rules.ott # l2_terminals_non_tt.ott l2_typ.ott l2_rules.ott - $(OTT) -sort false -generate_aux_rules false -o $@ -picky_multiple_parses true $^ - -doc_in.tex: l2.ott primitive_doc.ott l2_terminals_tt.ott l2_typ.ott l2_rules.ott - $(OTT) -sort false -generate_aux_rules false -tex_wrap false -o $@ -picky_multiple_parses true $^ - -%.tex: %.ott - $(OTT) -sort false -generate_aux_rules false -o $@ -picky_multiple_parses true $^ - -%.ml: %.ott - $(OTT) -sort false -generate_aux_rules true -o $@ -picky_multiple_parses true $^ - -%Script.sml: %.ott - $(OTT) -sort false -generate_aux_rules true -o $@ -picky_multiple_parses true $^ - -l2.lem: l2.ott - $(OTT) -sort false -generate_aux_rules true -o $@ -picky_multiple_parses true $^ - -ROOT=l2_parse2 -# generate the ocaml AST type, ocamllex lexer, menhir parser, and ocaml pretty printers for the AST, all from the Ott soruce -$(ROOT)_ast.ml $(ROOT)_lexer.mll $(ROOT)_parser.mly $(ROOT)_parser_pp.ml $(ROOT)_ast.tex : $(ROOT).ott Makefile - $(OTT) -quotient_rules false -generate_aux_rules false -i $(ROOT).ott -o $(ROOT)_parser.mly -o $(ROOT)_lexer.mll -o $(ROOT)_ast.ml -o $(ROOT).tex - - -clean: - rm -rf *~ - rm -rf *.uo *.ui *.sig *.sml .HOLMK - rm -f *.aux *.log *.dvi *.ps *.pdf *.toc - rm -rf l2.pdf l2_parse.pdf - rm -rf l2.tex doc_in.tex - -realclean: - $(MAKE) clean - rm -rf l2.ml l2_parse.ml l2.lem diff --git a/language/l2_parse.ott b/language/l2_parse.ott deleted file mode 100644 index 49df4908..00000000 --- a/language/l2_parse.ott +++ /dev/null @@ -1,1407 +0,0 @@ -indexvar n , i , j , k ::= - {{ phantom }} - {{ com Index variables for meta-lists }} - -metavar num ::= - {{ phantom }} - {{ lex numeric }} - {{ ocaml int }} - {{ hol num }} - {{ lem integer }} - {{ com Numeric literals }} - -metavar hex ::= - {{ phantom }} - {{ lex numeric }} - {{ ocaml string }} - {{ lem string }} - {{ com Bit vector literal, specified by C-style hex number }} - -metavar bin ::= - {{ phantom }} - {{ lex numeric }} - {{ ocaml string }} - {{ lem string }} - {{ com Bit vector literal, specified by C-style binary number }} - -metavar string ::= - {{ phantom }} - {{ ocaml string }} - {{ lem string }} - {{ hol string }} - {{ com String literals }} - -metavar regexp ::= - {{ phantom }} - {{ ocaml string }} - {{ lem string }} - {{ hol string }} - {{ com Regular expresions, as a string literal }} - -embed -{{ ocaml - -type l = - | Unknown - | Int of string * l option - | Generated of l - | Range of Lexing.position * Lexing.position - -type 'a annot = l * 'a - -exception Parse_error_locn of l * string - -}} - -embed -{{ lem -open import Map -open import Maybe -open import Pervasives - -type l = - | Unknown - | Trans of string * maybe l - | Range of nat * nat - -val duplicates : forall 'a. list 'a -> list 'a - -val union_map : forall 'a 'b. map 'a 'b -> map 'a 'b -> map 'a 'b - -val set_from_list : forall 'a. list 'a -> set 'a - -val subst : forall 'a. list 'a -> list 'a -> bool - -}} - -metavar x , y , z ::= - {{ ocaml string }} - {{ lem string }} - {{ hol string }} - {{ com identifier }} - {{ ocamlvar "[[x]]" }} - {{ lemvar "[[x]]" }} - -metavar ix ::= - {{ lex alphanum }} - {{ ocaml string }} - {{ lem string }} - {{ hol string }} - {{ com infix identifier }} - {{ ocamlvar "[[ix]]" }} - {{ lemvar "[[ix]]" }} - - - -grammar - -l :: '' ::= {{ phantom }} - {{ ocaml l }} - {{ lem l }} - {{ hol unit }} - {{ com Source location }} - | :: :: Unknown - {{ ocaml Unknown }} - {{ lem Unknown }} - {{ hol () }} - - -id :: '' ::= - {{ com Identifier }} - {{ aux _ l }} - | x :: :: id - | ( deinfix x ) :: :: deIid {{ com remove infix status }} - - -kid :: '' ::= - {{ com identifiers with kind, ticked to differntiate from program variables }} - {{ aux _ l }} - | ' x :: :: var - -% Note: we have just a single namespace. We don't want the same -% identifier to be reused as a type name or variable, expression -% variable, and field name. We don't enforce any lexical convention -% on type variables (or variables of other kinds) -% We don't enforce a lexical convention on infix operators, as some of the -% targets use alphabetical infix operators. - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Kinds and Types % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - -grammar - -base_kind :: 'BK_' ::= - {{ com base kind}} - {{ aux _ l }} - | Type :: :: type {{ com kind of types }} - | Nat :: :: nat {{ com kind of natural number size expressions }} - | Order :: :: order {{ com kind of vector order specifications }} - | Effect :: :: effect {{ com kind of effect sets }} - -kind :: 'K_' ::= - {{ com kinds}} - {{ aux _ l }} - | base_kind1 -> ... -> base_kindn :: :: kind -% we'll never use ...-> Nat - -base_effect :: 'BE_' ::= - {{ com effect }} - {{ aux _ l }} - | rreg :: :: rreg {{ com read register }} - | wreg :: :: wreg {{ com write register }} - | rmem :: :: rmem {{ com read memory }} - | wmem :: :: wmem {{ com write memory }} - | wmv :: :: wmv {{ com write memory value }} - | eamem :: :: eamem {{ com address for write signaled }} - | barr :: :: barr {{ com memory barrier }} - | depend :: :: depend {{ com dynmically dependent footprint }} - | undef :: :: undef {{ com undefined-instruction exception }} - | unspec :: :: unspec {{ com unspecified values }} - | nondet :: :: nondet {{ com nondeterminism from intra-instruction parallelism }} - | escape :: :: escape - -atyp :: 'ATyp_' ::= - {{ com expressions of all kinds, to be translated to types, nats, orders, and effects after parsing }} - {{ aux _ l }} - | id :: :: id {{ com identifier }} - | kid :: :: var {{ com ticked variable }} - | num :: :: constant {{ com constant }} - | atyp1 * atyp2 :: :: times {{ com product }} - | atyp1 + atyp2 :: :: sum {{ com sum }} - | atyp1 - atyp2 :: :: minus {{ com subtraction }} - | 2** atyp :: :: exp {{ com exponential }} - | neg atyp :: :: neg {{ com Internal (but not M as I want a datatype constructor) negative nexp }} - | ( atyp ) :: S :: paren {{ icho [[atyp]] }} - - | inc :: :: inc {{ com increasing (little-endian) }} - | dec :: :: dec {{ com decreasing (big-endian) }} - | defaultOrd :: :: default_ord {{ com default order for increasing or decreasing signficant bits }} - | { base_effect1 , .. , base_effectn } :: :: set {{ com effect set }} - | pure :: M :: pure {{ com sugar for empty effect set }} {{ icho [] }} - | atyp1 -> atyp2 effect atyp3 :: :: fn - {{ com Function type (first-order only in user code), last atyp is an effect }} - | ( atyp1 , .... , atypn ) :: :: tup - {{ com Tuple type }} - | id < atyp1 , .. , atypn > :: :: app - {{ com type constructor application }} - - -% plus more for l-value/r-value pairs, as introduced by the L3 'compound' declarations ... ref typ - -%typ_lib :: 'Typ_lib_' ::= -% {{ com library types and syntactic sugar for them }} -% {{ aux _ l }} %{{ auxparam 'a }} -% boring base types: -% | unit :: :: unit {{ com unit type with value $()$ }} -% | bool :: :: bool {{ com booleans $[[true]]$ and $[[false]]$ }} -% | bit :: :: bit {{ com pure bit values (not mutable bits) }} -% experimentally trying with two distinct types of bool and bit ... -% | nat :: :: nat {{ com natural numbers 0,1,2,... }} -% | string :: :: string {{ com UTF8 strings }} -% finite subranges of nat -% | enum nexp1 nexp2 order :: :: enum {{ com natural numbers [[atyp2]] .. [[atyp2]]+[[atyp1]]-1, ordered by order }} -% | [ nexp ] :: :: enum1 {{ com sugar for \texttt{enum nexp 0 inc} }} -% | [ nexp : nexp' ] :: :: enum2 {{ com sugar for \texttt{enum (nexp'-nexp+1) nexp inc} or \texttt{enum (nexp-nexp'+1) nexp' dec} }} -% use .. not - to avoid ambiguity with nexp - -% total maps and vectors indexed by finite subranges of nat -% | vector nexp1 nexp2 order atyp :: :: vector {{ com vector of [[atyp]], indexed by natural range }} -% probably some sugar for vector types, using [ ] similarly to enums: -% (but with .. not : in the former, to avoid confusion...) -% | atyp [ nexp ] :: :: vector2 {{ com sugar for vector indexed by [ [[atyp]] ] }} -% | atyp [ nexp : nexp' ] :: :: vector3 {{ com sugar for vector indexed by [ [[atyp]]..[[atyp']] ] }} -% ...so bit [ nexp ] etc is just an instance of that -% | list atyp :: :: list {{ com list of [[atyp]] }} -% | set atyp :: :: set {{ com finite set of [[atyp]] }} -% | reg atyp :: :: reg {{ com mutable register components holding [[atyp]] }} -% "reg t" is basically the ML "t ref" -% not sure how first-class it should be, though -% use "reg word32" etc for the types of vanilla registers - -parsing - -ATyp_tup <= ATyp_tup -ATyp_fn right ATyp_fn -ATyp_fn <= ATyp_tup - -grammar - -n_constraint :: 'NC_' ::= - {{ com constraint over kind $[[Nat]]$ }} - {{ aux _ l }} - | atyp = atyp' :: :: fixed - | atyp >= atyp' :: :: bounded_ge - | atyp '<=' atyp' :: :: bounded_le - | kid 'IN' { num1 , ... , numn } :: :: nat_set_bounded - -% Note only id on the left and constants on the right in a -% finite-set-bound, as we don't think we need anything more - -kinded_id :: 'KOpt_' ::= - {{ com optionally kind-annotated identifier }} - {{ aux _ l }} - | kid :: :: none {{ com identifier }} - | kind kid :: :: kind {{ com kind-annotated variable }} - -quant_item :: 'QI_' ::= - {{ com Either a kinded identifier or a nexp constraint for a typquant }} - {{ aux _ l }} - | kinded_id :: :: id {{ com An optionally kinded identifier }} - | n_constraint :: :: const {{ com A constraint for this type }} - -typquant :: 'TypQ_' ::= - {{ com type quantifiers and constraints}} - {{ aux _ l }} - | forall quant_item1 , ... , quant_itemn . :: :: tq {{ texlong }} - | :: :: no_forall {{ com sugar, omitting quantifier and constraints }} - -typschm :: 'TypSchm_' ::= - {{ com type scheme }} - {{ aux _ l }} - | typquant atyp :: :: ts - - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Type definitions % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -grammar -%ctor_def :: 'CT_' ::= -% {{ com Datatype constructor definition clause }} -% {{ aux _ l }} -% | id : typschm :: :: ct -% but we could get away with disallowing constraints in typschm, we -% think - if it's useful to do that - - name_scm_opt :: 'Name_sect_' ::= - {{ com Optional variable-naming-scheme specification for variables of defined type }} - {{ aux _ l }} - | :: :: none - | [ name = regexp ] :: :: some - -type_union :: 'Tu_' ::= - {{ com Type union constructors }} - {{ aux _ l }} - | id :: :: id - | atyp id :: :: ty_id - -type_def :: 'TD_' ::= - {{ com Type definition body }} - {{ aux _ l }} - | typedef id name_scm_opt = typschm :: :: abbrev - {{ com type abbreviation }} {{ texlong }} - | typedef id name_scm_opt = const struct typquant { atyp1 id1 ; ... ; atypn idn semi_opt } :: :: record - {{ com struct type definition }} {{ texlong }} - | typedef id name_scm_opt = const union typquant { type_union1 ; ... ; type_unionn semi_opt } :: :: variant - {{ com union type definition}} {{ texlong }} - | typedef id name_scm_opt = enumerate { id1 ; ... ; idn semi_opt } :: :: enum - {{ com enumeration type definition}} {{ texlong }} - - | typedef id = register bits [ atyp : atyp' ] { index_range1 : id1 ; ... ; index_rangen : idn } -:: :: register {{ com register mutable bitfield type definition }} {{ texlong }} - -kind_def :: 'KD_' ::= - {{ com Definition body for elements of kind; many are shorthands for type\_defs }} - {{ aux _ l }} - | Def kind id name_scm_opt = typschm :: :: abbrev - {{ com type abbreviation }} {{ texlong }} - | Def kind id name_scm_opt = const struct typquant { atyp1 id1 ; ... ; atypn idn semi_opt } :: :: record - {{ com struct type definition }} {{ texlong }} - | Def kind id name_scm_opt = const union typquant { type_union1 ; ... ; type_unionn semi_opt } :: :: variant - {{ com union type definition}} {{ texlong }} - | Def kind id name_scm_opt = enumerate { id1 ; ... ; idn semi_opt } :: :: enum - {{ com enumeration type definition}} {{ texlong }} - - | Def kind id = register bits [ atyp : atyp' ] { index_range1 : id1 ; ... ; index_rangen : idn } -:: :: register {{ com register mutable bitfield type definition }} {{ texlong }} - - -% also sugar [ nexp ] - - -index_range :: 'BF_' ::= {{ com index specification, for bitfields in register types}} - {{ aux _ l }} - | num :: :: 'single' {{ com single index }} - | num1 : num2 :: :: range {{ com index range }} - | index_range1 , index_range2 :: :: concat {{ com concatenation of index ranges }} - -% - - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Literals % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - -grammar - -lit :: 'L_' ::= - {{ com Literal constant }} - {{ aux _ l }} - | ( ) :: :: unit {{ com $() : [[unit]]$ }} -%Presumably we want to remove bitzero and bitone ? - | bitzero :: :: zero {{ com $[[bitzero]] : [[bit]]$ }} - | bitone :: :: one {{ com $[[bitone]] : [[bit]]$ }} - | true :: :: true {{ com $[[true]] : [[bool]]$ }} - | false :: :: false {{ com $[[false]] : [[bool]]$ }} - | num :: :: num {{ com natural number constant }} - | hex :: :: hex {{ com bit vector constant, C-style }} - {{ com hex and bin are constant bit vectors, C-style }} - | bin :: :: bin {{ com bit vector constant, C-style }} - | undefined :: :: undef {{ com undefined value }} - | string :: :: string {{ com string constant }} - -semi_opt {{ tex \ottnt{;}^{?} }} :: 'semi_' ::= {{ phantom }} - {{ ocaml bool }} - {{ lem bool }} - {{ hol bool }} - {{ com Optional semi-colon }} - | :: :: no - {{ hol F }} - {{ ocaml false }} - {{ lem false }} - | ';' :: :: yes - {{ hol T }} - {{ ocaml true }} - {{ lem true }} - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Patterns % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - -pat :: 'P_' ::= - {{ com Pattern }} - {{ aux _ l }} - | lit :: :: lit - {{ com literal constant pattern }} - | _ :: :: wild - {{ com wildcard }} - | ( pat as id ) :: :: as - {{ com named pattern }} - | ( atyp ) pat :: :: typ - {{ com typed pattern }} - - | id :: :: id - {{ com identifier }} - - | id ( pat1 , .. , patn ) :: :: app - {{ com union constructor pattern }} - - | { fpat1 ; ... ; fpatn semi_opt } :: :: record - {{ com struct pattern }} - - | [ pat1 , .. , patn ] :: :: vector - {{ com vector pattern }} - - | [ num1 = pat1 , .. , numn = patn ] :: :: vector_indexed - {{ com vector pattern (with explicit indices) }} - - | pat1 : .... : patn :: :: vector_concat - {{ com concatenated vector pattern }} - - | ( pat1 , .... , patn ) :: :: tup - {{ com tuple pattern }} - | [|| pat1 , .. , patn ||] :: :: list - {{ com list pattern }} - | ( pat ) :: S :: paren -{{ ichlo [[pat]] }} - -fpat :: 'FP_' ::= - {{ com Field pattern }} - {{ aux _ l }} - | id = pat :: :: Fpat - -parsing -P_app <= P_app -P_app <= P_as - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Expressions % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - - -grammar - -exp :: 'E_' ::= - {{ com Expression }} - {{ aux _ l }} - - | { exp1 ; ... ; expn } :: :: block {{ com block (parsing conflict with structs?) }} -% maybe we really should have indentation-sensitive syntax :-) (given that some of the targets do) - - | nondet { exp1 ; ... ; expn } :: :: nondet {{ com block that can evaluate the contained expressions in any ordering }} - - | id :: :: id - {{ com identifier }} - - | lit :: :: lit - {{ com literal constant }} - - | ( atyp ) exp :: :: cast - {{ com cast }} - - - | id exp :: S :: tup_app {{ ichlo [[id ( exp ) ]] }} {{ com No extra parens needed when exp is a tuple }} - | id ( exp1 , .. , expn ) :: :: app - {{ com function application }} -% Note: fully applied function application only - - | exp1 id exp2 :: :: app_infix - {{ com infix function application }} - - | ( exp1 , .... , expn ) :: :: tuple - {{ com tuple }} - - | if exp1 then exp2 else exp3 :: :: if - {{ com conditional }} - - | if exp1 then exp2 :: S :: ifnoelse {{ icho [[ if exp1 then exp2 else unit ]] }} - - | foreach id from exp1 to exp2 by exp3 in atyp exp4 :: :: for {{ com loop }} - | foreach id from exp1 to exp2 by exp3 exp4 :: S :: forup {{ ichlo [[ foreach id from exp1 to exp2 by exp3 in inc exp4 ]] }} - | foreach id from exp1 to exp2 exp3 :: S :: forupbyone {{ icho [[ foreach id from exp1 to exp2 by 1 exp4 ]] }} - | foreach id from exp1 downto exp2 by exp3 exp4 :: S :: fordown {{ icho [[ foreach id from exp1 to exp2 by ( - exp3 ) exp4 ]] }} - | foreach id from exp1 downto exp2 exp3 :: S :: fordownbyone {{ icho [[ foreach id from exp1 downto exp2 by 1 exp4 ]] }} - -% vectors - | [ exp1 , ... , expn ] :: :: vector {{ com vector (indexed from 0) }} -% order comes from global command-line option??? -% here the expi are of type 'a and the result is a vector of 'a, whereas in exp1 : ... : expn -% the expi and the result are both of type vector of 'a - - | [ exp1 , ... , expn opt_default ] :: :: vector_indexed {{ com vector (indexed consecutively) }} -% num1 .. numn must be a consecutive list of naturals - -% we pick [ ] not { } for vector literals for consistency with their -% array-like access syntax, in contrast to the C which has funny -% syntax for array literals. We don't have to preserve [ ] for lists -% as we don't expect to use lists very much. - - | exp [ exp' ] :: :: vector_access - {{ com vector access }} - - | exp [ exp1 '..' exp2 ] :: :: vector_subrange - {{ com subvector extraction }} - % do we want to allow a comma-separated list of such thingies? - - | [ exp with exp1 = exp2 ] :: :: vector_update - {{ com vector functional update }} - - | [ exp with exp1 : exp2 = exp3 ] :: :: vector_update_subrange - {{ com vector subrange update (with vector)}} - % do we want a functional update form with a comma-separated list of such? - - | exp : exp2 :: :: vector_append - {{ com vector concatenation }} - -% lists - | [|| exp1 , .. , expn ||] :: :: list - {{ com list }} - | exp1 '::' exp2 :: :: cons - {{ com cons }} - - -% const unions - -% const structs - -% TODO - - | { fexps } :: :: record - {{ com struct }} - | { exp with exp1 ; .. ; expn } :: :: record_update - {{ com functional update of struct }} - | exp . id :: :: field - {{ com field projection from struct }} - -%Expressions for creating and accessing vectors - - - -% map : forall 'x 'y ''N. ('x -> 'y) -> vector ''N 'x -> vector ''N 'y -% zip : forall 'x 'y ''N. vector ''N 'x -> vector ''N 'y -> vector ''N ('x*'y) -% foldl : forall 'x 'y ''N. ('x 'y -> 'y) -> vector ''N 'x -> 'y -> 'y -% foldr : forall 'x 'y ''N. ('x 'y -> 'y) -> 'y -> vector ''N 'x -> 'y -% foldmap : forall 'x 'y 'z ''N. ((x,y) -> (x,z)) -> x -> vector ''N y -> vector ''N z -%(or unzip) - -% and maybe with nice syntax - - | switch exp { case pexp1 ... case pexpn } :: :: case - {{ com pattern matching }} - | letbind in exp :: :: let - {{ com let expression }} - - | exp := exp' :: :: assign - {{ com imperative assignment }} - - | sizeof atyp :: :: sizeof - | exit exp :: :: exit - | return exp :: :: return - | assert ( exp , exp' ) :: :: assert - - | ( exp ) :: S :: paren {{ ichlo [[exp]] }} - - -lexp :: 'LEXP_' ::= {{ com lvalue expression, can't occur out of the parser }} - {{ aux _ l }} -% {{ aux _ annot }} {{ auxparam 'a }} - | id :: :: id - {{ com identifier }} - | id ( exp1 , .. , expn ) :: :: mem - | id exp :: S :: mem_tup {{ ichlo [[id (exp)]] }} - | lexp [ exp ] :: :: vector {{ com vector element }} - | lexp [ exp1 : exp2 ] :: :: vector_range {{ com subvector }} - % maybe comma-sep such lists too - | lexp . id :: :: field {{ com struct field }} - - -fexp :: 'FE_' ::= - {{ com Field-expression }} - {{ aux _ l }} -% {{ aux _ annot }} {{ auxparam 'a }} - | id = exp :: :: Fexp - -fexps :: 'FES_' ::= - {{ com Field-expression list }} - {{ aux _ l }} -% {{ aux _ annot }} {{ auxparam 'a }} - | fexp1 ; ... ; fexpn semi_opt :: :: Fexps - -opt_default :: 'Def_val_' ::= - {{ com Optional default value for indexed vectors, to define a defualt value for any unspecified positions in a sparse map }} - {{ aux _ l }} - | :: :: empty - | ; default = exp :: :: dec - -pexp :: 'Pat_' ::= - {{ com Pattern match }} - {{ aux _ l }} -% {{ aux _ annot }} {{ auxparam 'a }} - | pat -> exp :: :: exp -% apparently could use -> or => for this. - -%% % psexp :: 'Pats' ::= -%% % {{ com Multi-pattern matches }} -%% % {{ aux _ l }} -%% % | pat1 ... patn -> exp :: :: exp - - -parsing - -%P_app right LB_Let_val - -%%P_app <= Fun - -%%Fun right App -%%Function right App -E_case right E_app -E_let right E_app - -%%Fun <= Field -%%Function <= Field -E_app <= E_field -E_case <= E_field -E_let <= E_field - -E_app left E_app - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Function definitions % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%% old Lem style %%%%%% -grammar -%% % lem_tannot_opt_aux :: 'LEM_Typ_annot_' ::= -%% % {{ com Optional type annotations }} -%% % | :: :: none -%% % | : typ :: :: some -%% % -%% % lem_tannot_opt {{ tex \ottnt{tannot}^? }} :: 'LEM_Typ_annot_' ::= -%% % {{ com location-annotated optional type annotations }} -%% % | tannot_opt_aux l :: :: aux -%% % -%% % lem_funcl :: 'LEM_FCL' ::= -%% % {{ com Function clauses }} -%% % {{ aux _ l }} -%% % | id pat1 ... patn tannot_opt = exp :: :: Funcl -%% % -%% % lem_letbind :: 'LEM_LB_' ::= -%% % {{ com Let bindings }} -%% % {{ aux _ l }} -%% % | pat tannot_opt = exp :: :: Let_val -%% % {{ com Value bindings }} -%% % | lem_funcl :: :: Let_fun -%% % {{ com Function bindings }} -%% % -%% % -%% % grammar -%% % lem_val_def :: 'LEM_VD' ::= -%% % {{ com Value definitions }} -%% % {{ aux _ l }} -%% % | let lem_letbind :: :: Let_def -%% % {{ com Non-recursive value definitions }} -%% % | let rec lem_funcl1 and ... and lem_funcln :: :: Let_rec -%% % {{ com Recursive function definitions }} -%% % -%% % lem_val_spec :: 'LEM_VS' ::= -%% % {{ com Value type specifications }} -%% % {{ aux _ l }} -%% % | val x_l : typschm :: :: Val_spec - -%%%%% C-ish style %%%%%%%%%% - -tannot_opt :: 'Typ_annot_opt_' ::= - {{ com Optional type annotation for functions}} - {{ aux _ l }} -% {{ aux _ annot }} {{ auxparam 'a }} - | :: :: none - | typquant atyp :: :: some - -rec_opt :: 'Rec_' ::= - {{ com Optional recursive annotation for functions }} - {{ aux _ l }} - | :: :: nonrec {{ com non-recursive }} - | rec :: :: rec {{ com recursive }} - -effect_opt :: 'Effect_opt_' ::= - {{ com Optional effect annotation for functions }} - {{ aux _ l }} -% {{ aux _ annot }} {{ auxparam 'a }} - | :: :: pure {{ com sugar for empty effect set }} - | effectkw atyp :: :: effect - -funcl :: 'FCL_' ::= - {{ com Function clause }} - {{ aux _ l }} -% {{ aux _ annot }} {{ auxparam 'a }} - | id pat = exp :: :: Funcl - - -fundef :: 'FD_' ::= - {{ com Function definition}} - {{ aux _ l }} -% {{ aux _ annot }} {{ auxparam 'a }} - | function rec_opt tannot_opt effect_opt funcl1 and ... and funcln :: :: function {{ texlong }} -% {{ com function definition }} -% TODO note that the typ in the tannot_opt is the *result* type, not -% the type of the whole function. The argument type comes from the -% pattern in the funcl -% TODO the above is ok for single functions, but not for mutually -% recursive functions - the tannot_opt scopes over all the funcli, -% which is ok for the typ_quant part but not for the typ part - -letbind :: 'LB_' ::= - {{ com Let binding }} - {{ aux _ l }} -% {{ aux _ annot }} {{ auxparam 'a }} - | let typschm pat = exp :: :: val_explicit - {{ com value binding, explicit type ([[pat]] must be total)}} - | let pat = exp :: :: val_implicit - {{ com value binding, implicit type ([[pat]] must be total)}} - - -val_spec :: 'VS_' ::= - {{ com Value type specification }} - {{ aux _ l }} -% {{ aux _ annot }} {{ auxparam 'a }} - | val typschm id :: :: val_spec - | val extern typschm id :: :: extern_no_rename - | val extern typschm id = string :: :: extern_spec - -default_typing_spec :: 'DT_' ::= - {{ com Default kinding or typing assumption, and default order for literal vectors and vector shorthands }} - {{ aux _ l }} -% {{ aux _ annot }} {{ auxparam 'a }} - | default base_kind kid :: :: kind - | default base_kind atyp :: :: order - | default typschm id :: :: typ -% The intended semantics of these is that if an id in binding position -% doesn't have a kind or type annotation, then we look through the -% default regexps (in order from the beginning) and pick the first -% assumption for which id matches the regexp, if there is one. -% Otherwise we try to infer. Perhaps warn if there are multiple matches. -% For example, we might often have default Type ['alphanum] - -scattered_def :: 'SD_' ::= - {{ com Function and type union definitions that can be spread across - a file. Each one must end in $[[end id]]$ }} - {{ aux _ l }} - | scattered function rec_opt tannot_opt effect_opt id :: :: scattered_function {{ texlong }} {{ com scattered function definition header }} - - | function clause funcl :: :: scattered_funcl -{{ com scattered function definition clause }} - - | scattered typedef id name_scm_opt = const union typquant :: :: scattered_variant {{ texlong }} {{ com scattered union definition header }} - - | union id member type_union :: :: scattered_unioncl {{ com scattered union definition member }} - | end id :: :: scattered_end -{{ com scattered definition end }} - -dec_spec :: 'DEC_' ::= - {{ com Register declarations }} - {{ aux _ l }} - | register atyp id :: :: reg - | register alias id = exp :: :: alias - | register alias atyp id = exp :: :: typ_alias - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Top-level definitions % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -def :: 'DEF_' ::= - {{ com Top-level definition }} - | kind_def :: :: kind - {{ com definition of named kind identifiers }} - | type_def :: :: type - {{ com type definition }} - | fundef :: :: fundef - {{ com function definition }} - | letbind :: :: val - {{ com value definition }} - | val_spec :: :: spec - {{ com top-level type constraint }} - | default_typing_spec :: :: default - {{ com default kind and type assumptions }} - | scattered_def :: :: scattered - {{ com scattered definition }} - | dec_spec :: :: reg_dec - {{ com register declaration }} - -defs :: '' ::= - {{ com Definition sequence }} - | def1 .. defn :: :: Defs - - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Machinery for typing rules % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%% %% -%% %% -%% %% grammar -%% %% -%% %% -%% %% p :: 'Path_' ::= -%% %% {{ com Unique paths }} -%% %% | x1 . .. xn . x :: :: def -%% %% | __list :: :: list -%% %% {{ tex \ottkw{\_\_list} }} -%% %% | __bool :: :: bool -%% %% {{ tex \ottkw{\_\_bool} }} -%% %% | __num :: :: num -%% %% {{ tex \ottkw{\_\_num} }} -%% %% | __set :: :: set -%% %% {{ tex \ottkw{\_\_set} }} -%% %% | __string :: :: string -%% %% {{ tex \ottkw{\_\_string} }} -%% %% | __unit :: :: unit -%% %% {{ tex \ottkw{\_\_unit} }} -%% %% | __bit :: :: bit -%% %% {{ tex \ottkw{\_\_bit} }} -%% %% | __vector :: :: vector -%% %% {{ tex \ottkw{\_\_vector} }} -%% %% %TODO morally, delete the above - but what are the __ things for? -%% %% % cleaner to declare early in the library? -%% %% -%% %% t_subst {{ tex \ensuremath{\sigma} }} :: '' ::= {{ phantom }} -%% %% {{ hol (a # t) list }} -%% %% {{ lem list (tnvar * t) }} -%% %% {{ com Type variable substitutions }} -%% %% | { tnvar1 |-> t1 .. tnvarn |-> tn } :: :: T_subst -%% %% {{ ocaml (assert false) }} -%% %% {{ lem ([[tnvar1 t1 .. tnvarn tn]]) }} -%% %% {{ hol ([[tnvar1 t1 .. tnvarn tn]]) }} -%% %% -%% %% t , u :: 'T_' ::= -%% %% {{ com Internal types }} -%% %% | a :: :: var -%% %% | t1 -> t2 :: :: fn -%% %% | t1 * .... * tn :: :: tup -%% %% | p t_args :: :: app -%% %% | ne :: :: len -%% %% | t_subst ( t ) :: M :: subst_app -%% %% {{ com Multiple substitutions }} -%% %% {{ ocaml (assert false) }} -%% %% {{ hol (t_subst_t [[t_subst]] [[t]]) }} -%% %% {{ lem (t_subst_t [[t_subst]] [[t]]) }} -%% %% | t_subst ( tnv ) :: M :: var_subst_app -%% %% {{ com Single variable substitution }} -%% %% {{ ocaml (assert false) }} -%% %% {{ hol (t_subst_tnv [[t_subst]] [[tnv]]) }} -%% %% {{ lem (t_subst_tnv [[t_subst]] [[tnv]]) }} -%% %% | curry ( t_multi , t ) :: M :: multifn -%% %% {{ com Curried, multiple argument functions }} -%% %% {{ ocaml (assert false) }} -%% %% {{ hol (FOLDR T_fn [[t]] [[t_multi]]) }} -%% %% {{ lem (List.fold_right T_fn [[t_multi]] [[t]]) }} -%% %% -%% %% ne :: 'Ne_' ::= -%% %% {{ com internal numeric expressions }} -%% %% | N :: :: var -%% %% | nat :: :: const -%% %% | ne1 * ne2 :: :: mult -%% %% | ne1 + ne2 :: :: add -%% %% | ( - ne ) :: :: unary -%% %% | normalize ( ne ) :: M :: normalize -%% %% {{ ocaml (assert false) }} -%% %% {{ hol ARB }} -%% %% {{ lem (normalize [[ne]] ) }} -%% %% | ne1 + ... + nen :: M :: addmany -%% %% {{ ocaml (assert false) }} -%% %% {{ hol ARB }} -%% %% {{ lem (sumation_nes [[ne1...nen]]) }} -%% %% | bitlength ( bin ) :: M :: cbin -%% %% {{ ocaml (asssert false) }} -%% %% {{ hol ARB }} -%% %% {{ lem (blength [[bin]]) }} -%% %% | bitlength ( hex ) :: M :: chex -%% %% {{ ocaml (assert false) }} -%% %% {{ hol ARB }} -%% %% {{ lem (hlength [[hex]]) }} -%% %% | length ( pat1 ... patn ) :: M :: cpat -%% %% {{ ocaml (assert false) }} -%% %% {{ hol ARB }} -%% %% {{ lem (Ne_const (List.length [[pat1...patn]])) }} -%% %% | length ( exp1 ... expn ) :: M :: cexp -%% %% {{ hol ARB }} -%% %% {{ ocaml (assert false) }} -%% %% {{ lem (Ne_const (List.length [[exp1...expn]])) }} -%% %% -%% %% t_args :: '' ::= -%% %% {{ com Lists of types }} -%% %% | t1 .. tn :: :: T_args -%% %% | t_subst ( t_args ) :: M :: T_args_subst_app -%% %% {{ com Multiple substitutions }} -%% %% {{ ocaml (assert false) }} -%% %% {{ hol (t_subst_t_args [[t_subst]] [[t_args]]) }} -%% %% {{ lem (t_subst_t_args [[t_subst]] [[t_args]]) }} -%% %% -%% %% t_multi :: '' ::= {{ phantom }} -%% %% {{ hol t list }} -%% %% {{ ocaml t list }} -%% %% {{ lem list t }} -%% %% {{ com Lists of types }} -%% %% | ( t1 * .. * tn ) :: :: T_multi -%% %% {{ hol [[t1..tn]] }} -%% %% {{ lem [[t1..tn]] }} -%% %% | t_subst ( t_multi ) :: M :: T_multi_subst_app -%% %% {{ com Multiple substitutions }} -%% %% {{ ocaml (assert false) }} -%% %% {{ hol (MAP (t_subst_t [[t_subst]]) [[t_multi]]) }} -%% %% {{ lem (List.map (t_subst_t [[t_subst]]) [[t_multi]]) }} -%% %% -%% %% nec :: '' ::= -%% %% {{ com Numeric expression constraints }} -%% %% | ne < nec :: :: lessthan -%% %% | ne = nec :: :: eq -%% %% | ne <= nec :: :: lteq -%% %% | ne :: :: base -%% %% -%% %% parsing -%% %% T_fn right T_fn -%% %% T_tup <= T_multi -%% %% -%% %% embed -%% %% {{ lem -%% %% -%% %% val t_subst_t : list (tnv * t) -> t -> t -%% %% val t_subst_tnv : list (tnv * t) -> tnv -> t -%% %% val ftv_t : t -> list tnv -%% %% val ftv_tm : list t -> list tnv -%% %% val ftv_s : list (p*tnv) -> list tnv -%% %% val compatible_overlap : list (x*t) -> bool -%% %% -%% %% (*TODO Should this normalize following the implementation? And blength and hlength need a means of implementation*) -%% %% let normalize n = n -%% %% -%% %% let blength (_,bit) = Ne_const 8 -%% %% let hlength (_,bit) = Ne_const 8 -%% %% -%% %% let rec sumation_nes nes = match nes with -%% %% | [ a; b] -> Ne_add a b -%% %% | x :: y -> Ne_add x (sumation_nes y) -%% %% end -%% %% -%% %% }} -%% %% -%% %% grammar -%% %% -%% %% -%% %% names :: '' ::= {{ phantom }} -%% %% {{ hol x set }} -%% %% {{ lem set x }} -%% %% {{ ocaml Set.Make(String).t }} -%% %% {{ com Sets of names }} -%% %% | { x1 , .. , xn } :: :: Names -%% %% {{ hol (LIST_TO_SET [[x1..xn]]) }} -%% %% {{ lem (set_from_list [[x1..xn]]) }} -%% %% -%% %% semC {{ tex \ensuremath{\mathcal{C} } }} :: '' ::= -%% %% {{ hol (p#tnv) list }} -%% %% {{ lem list (p*tnv) }} -%% %% % {{ com Typeclass constraint lists }} -%% %% % | ( p1 tnv1 ) .. ( pn tnvn ) :: :: SemC_concrete -%% %% % {{ hol ([[p1 tnv1..pn tnvn]]) }} -%% %% % {{ lem ([[p1 tnv1..pn tnvn]]) }} -%% %% -%% %% env_tag :: '' ::= -%% %% {{ com Tags for the (non-constructor) value descriptions }} -%% %% % | method :: :: method -%% %% % {{ com Bound to a method }} -%% %% | val :: :: spec -%% %% {{ com Specified with val }} -%% %% | let :: :: def -%% %% {{ com Defined with let or indreln }} -%% %% -%% %% v_desc :: 'V_' ::= -%% %% {{ com Value descriptions }} -%% %% | < forall tnvs . t_multi -> p , ( x of names ) > :: :: constr -%% %% {{ com Constructors }} -%% %% | < forall tnvs . semC => t , env_tag > :: :: val -%% %% {{ com Values }} -%% %% -%% %% f_desc :: 'F_' ::= -%% %% | < forall tnvs . p -> t , ( x of names ) > :: :: field -%% %% {{ com Fields }} -%% %% -%% %% embed -%% %% {{ hol -%% %% load "fmaptreeTheory"; -%% %% val _ = -%% %% Hol_datatype -%% %% `env_body = <| env_p : x|->p; env_f : x|->f_desc; env_v : x|->v_desc |>`; -%% %% -%% %% val _ = Define ` -%% %% env_union e1 e2 = -%% %% let i1 = item e1 in -%% %% let m1 = map e1 in -%% %% let i2 = item e2 in -%% %% let m2 = map e2 in -%% %% FTNode <| env_p:=FUNION i1.env_p i2.env_p; -%% %% env_f:=FUNION i1.env_f i2.env_f; -%% %% env_v:=FUNION i1.env_v i2.env_v |> -%% %% (FUNION m1 m2)`; -%% %% }} -%% %% {{ lem -%% %% type env = -%% %% | EnvEmp -%% %% | Env of (map x env) * (map x p) * (map x f_desc) * (map x v_desc) -%% %% -%% %% val env_union : env -> env -> env -%% %% let env_union e1 e2 = -%% %% match (e1,e2) with -%% %% | (EnvEmp,e2) -> e2 -%% %% | (e1,EnvEmp) -> e1 -%% %% | ((Env Em1 Ep1 Ef1 Ev1),(Env Em2 Ep2 Ef2 Ev2)) -> -%% %% Env(union_map Em1 Em2) (union_map Ep1 Ep2) (union_map Ef1 Ef2) (union_map Ev1 Ev2) -%% %% end -%% %% -%% %% }} -%% %% -%% %% grammar -%% %% -%% %% xs :: '' ::= {{ phantom }} -%% %% {{ hol string list }} -%% %% {{ lem list string }} -%% %% | x1 .. xn :: :: Xs -%% %% {{ hol [[x1..xn]] }} -%% %% {{ lem [[x1..xn]] }} -%% %% -%% %% %TODO: no clue what the following are: -%% %% S_c {{ tex {\ensuremath{ {\Sigma}^{\mathcal{C} } } } }} :: '' ::= {{ phantom }} -%% %% {{ hol (p#t) list }} -%% %% {{ lem list (p*t) }} -%% %% {{ com Typeclass constraints }} -%% %% | { ( p1 t1 ) , .. , ( pn tn ) } :: :: S_concrete -%% %% {{ hol [[p1 t1 .. pn tn]] }} -%% %% {{ lem [[p1 t1 .. pn tn]] }} -%% %% | S_c1 union .. union S_cn :: M :: S_union -%% %% {{ hol (FLAT [[S_c1..S_cn]]) }} -%% %% {{ lem (List.flatten [[S_c1..S_cn]]) }} -%% %% {{ ocaml assert false }} -%% %% -%% %% S_N {{ tex { \ensuremath{ {\Sigma}^{\mathcal{N} } } } }} :: '' ::= {{ phantom }} -%% %% {{ hol nec list }} -%% %% {{ lem list nec }} -%% %% {{ com nexp constraint lists }} -%% %% | { nec1 , .. , necn } :: :: Sn_concrete -%% %% {{ hol [[nec1 .. necn]] }} -%% %% {{ lem [[nec1 .. necn]] }} -%% %% | S_N1 union .. union S_Nn :: M :: SN_union -%% %% {{ hol (FLAT [[S_N1..S_Nn]]) }} -%% %% {{ lem (List.flatten [[S_N1..S_Nn]]) }} -%% %% {{ ocaml assert false }} -%% %% -%% %% -%% %% E :: '' ::= {{ phantom }} -%% %% {{ hol ((string,env_body) fmaptree) }} -%% %% -%% %% -%% %% %TODO: simplify by removing E_m throughout? And E_p?? -%% %% {{ lem env }} -%% %% {{ com Environments }} -%% %% | < E_m , E_p , E_f , E_x > :: :: E -%% %% {{ hol (FTNode <|env_p:=[[E_p]]; env_f:=[[E_f]]; env_v:=[[E_x]]|> ([[E_m]])) }} -%% %% {{ lem (Env [[E_m]] [[E_p]] [[E_f]] [[E_x]]) }} -%% %% | E1 u+ E2 :: M :: E_union -%% %% {{ hol (env_union [[E1]] [[E2]]) }} -%% %% {{ lem (env_union [[E1]] [[E2]]) }} -%% %% {{ ocaml assert false }} -%% %% | empty :: M :: E_empty -%% %% {{ hol (FTNode <|env_p:=FEMPTY; env_f:=FEMPTY; env_v:=FEMPTY|> FEMPTY) }} -%% %% {{ lem EnvEmp }} -%% %% {{ ocaml assert false }} -%% %% -%% %% E_x {{ tex \ottnt{E}^{\textsc{x} } }} :: 'E_x_' ::= {{ phantom }} -%% %% {{ hol (x|-> v_desc) }} -%% %% {{ lem map x v_desc }} -%% %% {{ com Value environments }} -%% %% | { x1 |-> v_desc1 , .. , xn |-> v_descn } :: :: concrete -%% %% {{ hol (FOLDR (\(k1,k2) E. E |+ (k1,k2)) FEMPTY [[x1 v_desc1 .. xn v_descn]]) }} -%% %% {{ lem (List.fold_right (fun (x,v) m -> Pmap.add x v m) [[x1 v_desc1 .. xn v_descn]] Pmap.empty) }} -%% %% | E_x1 u+ .. u+ E_xn :: M :: union -%% %% {{ hol (FOLDR FUNION FEMPTY [[E_x1..E_xn]]) }} -%% %% {{ lem (List.fold_right union_map [[E_x1..E_xn]] Pmap.empty) }} -%% %% {{ ocaml (assert false) }} -%% %% -%% %% E_f {{ tex \ottnt{E}^{\textsc{f} } }} :: 'E_f_' ::= {{ phantom }} -%% %% {{ hol (x |-> f_desc) }} -%% %% {{ lem map x f_desc }} -%% %% {{ com Field environments }} -%% %% | { x1 |-> f_desc1 , .. , xn |-> f_descn } :: :: concrete -%% %% {{ hol (FOLDR (\x E. E |+ x) FEMPTY [[x1 f_desc1 .. xn f_descn]]) }} -%% %% {{ lem (List.fold_right (fun (x,f) m -> Pmap.add x f m) [[x1 f_desc1 .. xn f_descn]] Pmap.empty) }} -%% %% | E_f1 u+ .. u+ E_fn :: M :: union -%% %% {{ hol (FOLDR FUNION FEMPTY [[E_f1..E_fn]]) }} -%% %% {{ lem (List.fold_right union_map [[E_f1..E_fn]] Pmap.empty) }} -%% %% {{ ocaml (assert false) }} -%% %% -%% %% E_m {{ tex \ottnt{E}^{\textsc{m} } }} :: 'E_m_' ::= {{ phantom }} -%% %% {{ hol (string |-> (string,env_body) fmaptree) }} -%% %% {{ lem map x env }} -%% %% % {{ com Module environments }} -%% %% % | { x1 |-> E1 , .. , xn |-> En } :: :: concrete -%% %% % {{ hol (FOLDR (\x E. E |+ x) FEMPTY [[x1 E1 .. xn En]]) }} -%% %% % {{ lem (List.fold_right (fun (x,e) m -> Pmap.add x e m) [[x1 E1 .. xn En]] Pmap.empty) }} -%% %% % -%% %% % _p {{ tex \ottnt{E}^{\textsc{p} } }} :: 'E_p_' ::= {{ phantom }} -%% %% % {{ hol (x |-> p) }} -%% %% % {{ lem map x p }} -%% %% % {{ com Path environments }} -%% %% % | { x1 |-> p1 , .. , xn |-> pn } :: :: concrete -%% %% % {{ hol (FOLDR (\x E. E |+ x) FEMPTY [[x1 p1 .. xn pn]]) }} -%% %% % {{ lem (List.fold_right (fun (x,p) m -> Pmap.add x p m) [[x1 p1 .. xn pn]] Pmap.empty) }} -%% %% % | E_p1 u+ .. u+ E_pn :: M :: union -%% %% % {{ hol (FOLDR FUNION FEMPTY [[E_p1..E_pn]]) }} -%% %% % {{ lem (List.fold_right union_map [[E_p1..E_pn]] Pmap.empty) }} -%% %% % -%% %% % {{ ocaml (assert false) }} -%% %% E_l {{ tex \ottnt{E}^{\textsc{l} } }} :: 'E_l_' ::= {{ phantom }} -%% %% {{ hol (x |-> t) }} -%% %% {{ lem map x t }} -%% %% {{ com Lexical bindings }} -%% %% | { x1 |-> t1 , .. , xn |-> tn } :: :: concrete -%% %% {{ hol (FOLDR (\x E. E |+ x) FEMPTY [[x1 t1 .. xn tn]]) }} -%% %% {{ lem (List.fold_right (fun (x,t) m -> Pmap.add x t m) [[x1 t1 .. xn tn]] Pmap.empty) }} -%% %% | E_l1 u+ .. u+ E_ln :: M :: union -%% %% {{ hol (FOLDR FUNION FEMPTY [[E_l1..E_ln]]) }} -%% %% {{ lem (List.fold_right union_map [[E_l1..E_ln]] Pmap.empty) }} -%% %% {{ ocaml (assert false) }} -%% %% -%% %% tc_abbrev :: 'Tc_abbrev_' ::= {{ phantom }} -%% %% {{ hol t option }} -%% %% {{ lem option t }} -%% %% {{ ocaml t option }} -%% %% {{ com Type abbreviations }} -%% %% | . t :: :: some -%% %% {{ hol (SOME [[t]]) }} -%% %% {{ lem (Some [[t]]) }} -%% %% | :: :: none -%% %% {{ hol NONE }} -%% %% {{ lem None }} -%% %% -%% %% tc_def :: '' ::= -%% %% {{ com Type and class constructor definitions }} -%% %% | tnvs tc_abbrev :: :: Tc_def -%% %% {{ com Type constructors }} -%% %% -%% %% TD {{ tex \ensuremath{\Delta} }} :: 'TD_' ::= {{ phantom }} -%% %% {{ hol p |-> tc_def }} -%% %% {{ lem map p tc_def }} -%% %% {{ com Type constructor definitions }} -%% %% | { p1 |-> tc_def1 , .. , pn |-> tc_defn } :: :: concrete -%% %% {{ hol (FOLDR (\x E. E |+ x) FEMPTY [[p1 tc_def1 .. pn tc_defn]]) }} -%% %% {{ lem (List.fold_right (fun (p,t) m -> Pmap.add p t m) [[p1 tc_def1 .. pn tc_defn]] Pmap.empty) }} -%% %% {{ ocaml (assert false) }} -%% %% | TD1 u+ TD2 :: M :: union -%% %% {{ hol (FUNION [[TD1]] [[TD2]]) }} -%% %% {{ lem (union_map [[TD1]] [[TD2]]) }} -%% %% {{ ocaml (assert false) }} -%% %% -%% %% -%% %% -%% %% D :: 'D_' ::= {{ phantom }} -%% %% {{ hol ((p |-> tc_def) # (p |-> x list) # (inst list)) }} -%% %% {{ lem tdefs}} -%% %% {{ com Global type definition store }} -%% %% | < TD , TC , I > :: :: concrete -%% %% {{ hol ([[TD]], [[TC]], [[I]]) }} -%% %% {{ lem (D [[TD]] [[TC]] [[I]]) }} -%% %% | D1 u+ D2 :: M :: union -%% %% {{ hol (case ([[D1]],[[D2]]) of ((x1,x2,x3),(y1,y2,y3)) => (FUNION x1 y1, FUNION x2 y2, x3 ++ y3)) }} -%% %% {{ lem (union_tcdefs [[D1]] [[D2]]) }} -%% %% {{ ocaml (assert false) }} -%% %% | empty :: M :: empty -%% %% {{ hol (FEMPTY, FEMPTY, []) }} -%% %% {{ lem DEmp }} -%% %% {{ ocaml assert false }} -%% %% -%% %% parsing -%% %% E_union left E_union -%% %% -%% %% embed -%% %% {{ lem -%% %% type tdefs = -%% %% | DEmp -%% %% | D of (map p tc_def) * (map p (list x)) * (set inst) -%% %% -%% %% val union_tcdefs : tdefs -> tdefs -> tdefs -%% %% -%% %% }} - -grammar - -terminals :: '' ::= - | ** :: :: starstar - {{ tex \ensuremath{\mathop{\mathord{*}\mathord{*} } } }} - {{ com \texttt{**} }} - | >= :: :: geq - {{ tex \ensuremath{\geq} }} - {{ com \texttt{>=} }} - | '<=' :: :: leq - {{ tex \ensuremath{\leq} }} - {{ com \texttt{<=} }} - | -> :: :: arrow - {{ tex \ensuremath{\rightarrow} }} - {{ com \texttt{->} }} - | ==> :: :: Longrightarrow - {{ tex \ensuremath{\Longrightarrow} }} - {{ com \texttt{==>} }} - | <| :: :: startrec - {{ tex \ensuremath{\langle|} }} - {{ com \texttt{<|} }} - | |> :: :: endrec - {{ tex \ensuremath{|\rangle} }} - {{ com \texttt{|>} }} - | inter :: :: inter - {{ tex \ensuremath{\cap} }} -% | union :: :: union -% {{ tex \ensuremath{\cup} }} - | u+ :: :: uplus - {{ tex \ensuremath{\uplus} }} - | NOTIN :: :: notin - {{ tex \ensuremath{\not\in} }} - | SUBSET :: :: subset - {{ tex \ensuremath{\subset} }} - | NOTEQ :: :: noteq - {{ tex \ensuremath{\not=} }} - | emptyset :: :: emptyset - {{ tex \ensuremath{\emptyset} }} - | < :: :: lt - {{ tex \ensuremath{\langle} }} - | > :: :: gt - {{ tex \ensuremath{\rangle} }} - | |- :: :: vdash - {{ tex \ensuremath{\vdash} }} - | ' :: :: quote - {{ tex \mbox{'} }} - | |-> :: :: mapsto - {{ tex \ensuremath{\mapsto} }} - | gives :: :: gives - {{ tex \ensuremath{\triangleright} }} - | ~> :: :: leadsto - {{ tex \ensuremath{\leadsto} }} - | => :: :: Rightarrow - {{ tex \ensuremath{\Rightarrow} }} - | -- :: :: dashdash - {{ tex \mbox{--} }} - | empty :: :: empty - {{ tex \ensuremath{\epsilon} }} - | effectkw :: :: effectkw - {{ tex \ottkw{effect} }} - - -formula :: formula_ ::= - | judgement :: :: judgement - - | formula1 .. formulan :: :: dots - -% | E_m ( x ) gives E :: :: lookup_m -% {{ com Module lookup }} -% {{ hol (FLOOKUP [[E_m]] [[x]] = SOME [[E]]) }} -% {{ lem (Pmap.find [[x]] [[E_m]]) = [[E]] }} -% -% | E_p ( x ) gives p :: :: lookup_p -% {{ com Path lookup }} -% {{ hol (FLOOKUP [[E_p]] [[x]] = SOME [[p]]) }} -% {{ lem Pmap.find [[x]] [[E_p]] = [[p]] }} - -%% %% | E_f ( x ) gives f_desc :: :: lookup_f -%% %% {{ com Field lookup }} -%% %% {{ hol (FLOOKUP [[E_f]] [[x]] = SOME [[f_desc]]) }} -%% %% {{ lem Pmap.find [[x]] [[E_f]] = [[f_desc]] }} -%% %% -%% %% | E_x ( x ) gives v_desc :: :: lookup_v -%% %% {{ com Value lookup }} -%% %% {{ hol (FLOOKUP [[E_x]] [[x]] = SOME [[v_desc]]) }} -%% %% {{ lem Pmap.find [[x]] [[E_x]] = [[v_desc]] }} -%% %% -%% %% | E_l ( x ) gives t :: :: lookup_l -%% %% {{ com Lexical binding lookup }} -%% %% {{ hol (FLOOKUP [[E_l]] [[x]] = SOME [[t]]) }} -%% %% {{ lem Pmap.find [[x]] [[E_l]] = [[t]] }} -%% %% -%% %% % | TD ( p ) gives tc_def :: :: lookup_tc -%% %% % {{ com Type constructor lookup }} -%% %% % {{ hol (FLOOKUP [[TD]] [[p]] = SOME [[tc_def]]) }} -%% %% % {{ lem Pmap.find [[p]] [[TD]] = [[tc_def]] }} -%% %% % -%% %% % | TC ( p ) gives xs :: :: lookup_class -%% %% % {{ com Type constructor lookup }} -%% %% % {{ hol (FLOOKUP [[TC]] [[p]] = SOME [[xs]]) }} -%% %% % {{ lem Pmap.find [[p]] [[TC]] = [[xs]] }} -%% %% -%% %% | dom ( E_m1 ) inter dom ( E_m2 ) = emptyset :: :: E_m_disjoint -%% %% {{ hol (DISJOINT (FDOM [[E_m1]]) (FDOM [[E_m2]])) }} -%% %% {{ lem disjoint (Pmap.domain [[E_m1]]) (Pmap.domain [[E_m2]]) }} -%% %% -%% %% | dom ( E_x1 ) inter dom ( E_x2 ) = emptyset :: :: E_x_disjoint -%% %% {{ hol (DISJOINT (FDOM [[E_x1]]) (FDOM [[E_x2]])) }} -%% %% {{ lem disjoint (Pmap.domain [[E_x1]]) (Pmap.domain [[E_x2]]) }} -%% %% -%% %% | dom ( E_f1 ) inter dom ( E_f2 ) = emptyset :: :: E_f_disjoint -%% %% {{ hol (DISJOINT (FDOM [[E_f1]]) (FDOM [[E_f2]])) }} -%% %% {{ lem disjoint (Pmap.domain [[E_f1]]) (Pmap.domain [[E_f2]]) }} -%% %% -%% %% % | dom ( E_p1 ) inter dom ( E_p2 ) = emptyset :: :: E_p_disjoint -%% %% % {{ hol (DISJOINT (FDOM [[E_p1]]) (FDOM [[E_p2]])) }} -%% %% % {{ lem disjoint (Pmap.domain [[E_p1]]) (Pmap.domain [[E_p2]]) }} -%% %% % -%% %% | disjoint doms ( E_l1 , .... , E_ln ) :: :: E_l_disjoint -%% %% {{ hol (FOLDR (\E b. case b of NONE => NONE | SOME s => if DISJOINT (FDOM -%% %% E) s then SOME (FDOM E UNION s) else NONE) (SOME {}) [[E_l1....E_ln]] <> NONE) }} -%% %% {{ lem disjoint_all (List.map Pmap.domain [[E_l1 .... E_ln]]) }} -%% %% {{ com Pairwise disjoint domains }} -%% %% -%% %% | disjoint doms ( E_x1 , .... , E_xn ) :: :: E_x_disjoint_many -%% %% {{ hol (FOLDR (\E b. case b of NONE => NONE | SOME s => if DISJOINT (FDOM -%% %% E) s then SOME (FDOM E UNION s) else NONE) (SOME {}) [[E_x1....E_xn]] <> NONE) }} -%% %% {{ lem disjoint_all (List.map Pmap.domain [[E_x1 .... E_xn]]) }} -%% %% {{ com Pairwise disjoint domains }} -%% %% -%% %% | compatible overlap ( x1 |-> t1 , .. , xn |-> tn ) :: :: E_l_compat -%% %% {{ hol (!__n __m. MEM __m [[x1 t1 .. xn tn]] /\ MEM __n [[x1 t1..xn tn]] /\ (FST __m = FST __n) ==> (SND __m = SND __n)) }} -%% %% {{ lem (compatible_overlap [[x1 t1 .. xn tn]]) }} -%% %% {{ com $(\ottnt{x}_i = \ottnt{x}_j) \ensuremath{\Longrightarrow} (\ottnt{t}_i = \ottnt{t}_j)$ }} -%% %% -%% %% | duplicates ( tnvs ) = emptyset :: :: no_dups_tnvs -%% %% {{ hol (ALL_DISTINCT [[tnvs]]) }} -%% %% {{ lem (duplicates [[tnvs]]) = [ ] }} -%% %% -%% %% | duplicates ( x1 , .. , xn ) = emptyset :: :: no_dups -%% %% {{ hol (ALL_DISTINCT [[x1..xn]]) }} -%% %% {{ lem (duplicates [[x1..xn]]) = [ ] }} -%% %% -%% %% | x NOTIN dom ( E_l ) :: :: notin_dom_l -%% %% {{ hol ([[x]] NOTIN FDOM [[E_l]]) }} -%% %% {{ lem Pervasives.not (Pmap.mem [[x]] [[E_l]]) }} -%% %% -%% %% | x NOTIN dom ( E_x ) :: :: notin_dom_v -%% %% {{ hol ([[x]] NOTIN FDOM [[E_x]]) }} -%% %% {{ lem Pervasives.not (Pmap.mem [[x]] [[E_x]]) }} -%% %% -%% %% | x NOTIN dom ( E_f ) :: :: notin_dom_f -%% %% {{ hol ([[x]] NOTIN FDOM [[E_f]]) }} -%% %% {{ lem Pervasives.not (Pmap.mem [[x]] [[E_f]]) }} -%% %% -%% %% % | p NOTIN dom ( TC ) :: :: notin_dom_tc -%% %% % {{ hol ([[p]] NOTIN FDOM [[TC]]) }} -%% %% % {{ lem Pervasives.not (Pmap.mem [[p]] [[TC]]) }} -%% %% -%% %% | p NOTIN dom ( TD ) :: :: notin_dom_td -%% %% {{ hol ([[p]] NOTIN FDOM [[TD]]) }} -%% %% {{ lem Pervasives.not (Pmap.mem [[p]] [[TD]]) }} -%% %% -%% %% | FV ( t ) SUBSET tnvs :: :: FV_t -%% %% {{ com Free type variables }} -%% %% {{ hol (LIST_TO_SET (ftv_t [[t]]) SUBSET LIST_TO_SET [[tnvs]]) }} -%% %% {{ lem subst (ftv_t [[t]]) [[tnvs]] }} -%% %% -%% %% | FV ( t_multi ) SUBSET tnvs :: :: FV_t_multi -%% %% {{ com Free type variables }} -%% %% {{ hol (LIST_TO_SET (FLAT (MAP ftv_t [[t_multi]])) SUBSET LIST_TO_SET [[tnvs]]) }} -%% %% {{ lem subst (ftv_tm [[t_multi]]) [[tnvs]] }} -%% %% -%% %% | FV ( semC ) SUBSET tnvs :: :: FV_semC -%% %% {{ com Free type variables }} -%% %% {{ hol (LIST_TO_SET (MAP SND [[semC]]) SUBSET LIST_TO_SET [[tnvs]]) }} -%% %% {{ lem subst (ftv_s [[semC]]) [[tnvs]] }} -%% %% -%% %% | inst 'IN' I :: :: inst_in -%% %% {{ hol (MEM [[inst]] [[I]]) }} -%% %% {{ lem ([[inst]] IN [[I]]) }} -%% %% -%% %% | ( p t ) NOTIN I :: :: notin_I -%% %% {{ hol (~?__semC__. MEM (Inst __semC__ [[p]] [[t]]) [[I]]) }} -%% %% {{ lem (Pervasives.not ((Inst [] [[p]] [[t]]) IN [[I]])) }} -%% %% -%% %% | E_l1 = E_l2 :: :: E_l_eqn -%% %% {{ ichl ([[E_l1]] = [[E_l2]]) }} -%% %% -%% %% | E_x1 = E_x2 :: :: E_x_eqn -%% %% {{ ichl ([[E_x1]] = [[E_x2]]) }} -%% %% -%% %% | E_f1 = E_f2 :: :: E_f_eqn -%% %% {{ ichl ([[E_f1]] = [[E_f2]]) }} -%% %% -%% %% | E1 = E2 :: :: E_eqn -%% %% {{ ichl ([[E1]] = [[E2]]) }} -%% %% -%% %% | TD1 = TD2 :: :: TD_eqn -%% %% {{ ichl ([[TD1]] = [[TD2]]) }} -%% %% -%% %% | TC1 = TC2 :: :: TC_eqn -%% %% {{ ichl ([[TC1]] = [[TC2]]) }} -%% %% -%% %% | I1 = I2 :: :: I_eqn -%% %% {{ ichl ([[I1]] = [[I2]]) }} -%% %% -%% %% | names1 = names2 :: :: names_eq -%% %% {{ ichl ([[names1]] = [[names2]]) }} -%% %% -%% %% | t1 = t2 :: :: t_eq -%% %% {{ ichl ([[t1]] = [[t2]]) }} -%% %% -%% %% | t_subst1 = t_subst2 :: :: t_subst_eq -%% %% {{ ichl ([[t_subst1]] = [[t_subst2]]) }} -%% %% -%% %% | p1 = p2 :: :: p_eq -%% %% {{ ichl ([[p1]] = [[p2]]) }} -%% %% -%% %% | xs1 = xs2 :: :: xs_eq -%% %% {{ ichl ([[xs1]] = [[xs2]]) }} -%% %% -%% %% | tnvs1 = tnvs2 :: :: tnvs_eq -%% %% {{ ichl ([[tnvs1]] = [[tnvs2]]) }} - diff --git a/language/l2_parse2.ott b/language/l2_parse2.ott deleted file mode 100644 index 0f8dc8e7..00000000 --- a/language/l2_parse2.ott +++ /dev/null @@ -1,1424 +0,0 @@ -indexvar n , i , j , k ::= - {{ phantom }} - {{ com Index variables for meta-lists }} - -metavar num ::= - {{ phantom }} - {{ lex numeric }} - {{ ocaml int }} - {{ hol num }} - {{ lem integer }} - {{ com Numeric literals }} - {{ ocamllex ['0'-'9']+ }} - -metavar hex ::= - {{ phantom }} - {{ lex numeric }} - {{ ocaml string }} - {{ lem string }} -{{ ocamllex '0''x'['0'-'9' 'A' - 'F' 'a'-'f' '_']+ }} - {{ com Bit vector literal, specified by C-style hex number }} - -metavar bin ::= - {{ phantom }} - {{ lex numeric }} - {{ ocaml string }} - {{ lem string }} -{{ ocamllex '\'' ['0' '1' ' ']* '\'' }} - {{ com Bit vector literal, specified by C-style binary number }} - -metavar string ::= - {{ phantom }} - {{ ocaml string }} - {{ lem string }} - {{ hol string }} - {{ ocamllex "a" }} {{ phantom }} - {{ com String literals }} - -metavar regexp ::= - {{ phantom }} - {{ ocaml string }} - {{ lem string }} - {{ hol string }} - {{ ocamllex "a" }} {{ phantom }} - {{ com Regular expresions, as a string literal }} - -embed -{{ ocaml - -type l = - | Unknown - | Int of string * l option - | Generated of l - | Range of Lexing.position * Lexing.position - -type 'a annot = l * 'a - -exception Parse_error_locn of l * string - -}} - -embed -{{ lem -open import Map -open import Maybe -open import Pervasives - -type l = - | Unknown - | Trans of string * maybe l - | Range of nat * nat - -val duplicates : forall 'a. list 'a -> list 'a - -val union_map : forall 'a 'b. map 'a 'b -> map 'a 'b -> map 'a 'b - -val set_from_list : forall 'a. list 'a -> set 'a - -val subst : forall 'a. list 'a -> list 'a -> bool - -}} - -metavar x , y , z ::= - {{ ocaml string }} - {{ lem string }} - {{ hol string }} - {{ com identifier }} - {{ ocamlvar "[[x]]" }} - {{ lemvar "[[x]]" }} - {{ ocamllex "a" }} {{ phantom }} - -metavar ix ::= - {{ lex alphanum }} - {{ ocaml string }} - {{ lem string }} - {{ hol string }} - {{ com infix identifier }} - {{ ocamlvar "[[ix]]" }} - {{ lemvar "[[ix]]" }} - {{ ocamllex "a" }} {{ phantom }} - - -grammar - -l :: '' ::= {{ phantom }} - {{ ocaml l }} - {{ lem l }} - {{ hol unit }} - {{ com Source location }} - | :: :: Unknown - {{ ocaml Unknown }} - {{ lem Unknown }} - {{ hol () }} - - -id :: '' ::= - {{ com Identifier }} - {{ aux _ l }} - | x :: :: id - | op x :: :: deIid {{ com remove infix status }} - - -kid :: '' ::= - {{ com identifiers with kind, ticked to differntiate from program variables }} - {{ aux _ l }} - | ' x :: :: var - -% Note: we have just a single namespace. We don't want the same -% identifier to be reused as a type name or variable, expression -% variable, and field name. We don't enforce any lexical convention -% on type variables (or variables of other kinds) -% We don't enforce a lexical convention on infix operators, as some of the -% targets use alphabetical infix operators. - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Kinds and Types % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - -grammar - -base_kind :: 'BK_' ::= - {{ com base kind}} - {{ aux _ l }} - | Type :: :: type {{ com kind of types }} - | Nat :: :: nat {{ com kind of natural number size expressions }} - | Order :: :: order {{ com kind of vector order specifications }} - | Effect :: :: effect {{ com kind of effect sets }} - -kind :: 'K_' ::= - {{ com kinds}} - {{ aux _ l }} - | base_kind1 -> ... -> base_kindn :: :: kind -% we'll never use ...-> Nat - -base_effect :: 'BE_' ::= - {{ com effect }} - {{ aux _ l }} - | rreg :: :: rreg {{ com read register }} - | wreg :: :: wreg {{ com write register }} - | rmem :: :: rmem {{ com read memory }} - | wmem :: :: wmem {{ com write memory }} - | wmv :: :: wmv {{ com write memory value }} - | eamem :: :: eamem {{ com address for write signaled }} - | barr :: :: barr {{ com memory barrier }} - | depend :: :: depend {{ com dynmically dependent footprint }} - | undef :: :: undef {{ com undefined-instruction exception }} - | unspec :: :: unspec {{ com unspecified values }} - | nondet :: :: nondet {{ com nondeterminism from intra-instruction parallelism }} - | escape :: :: escape - - - -atomic_typ :: 'ATyp_' ::= - {{ quotient-with atyp }} - | id :: :: id - | kid :: :: var - | num :: :: constant - | dec :: :: dec - | inc :: :: inc - | id ( atyp1 , ... , atypn ) :: :: app - | ( atyp ) :: S :: paren {{ ocaml [[atyp]] }} - | ( atyp1 , .... , atypn ) :: :: tup - | {| num_list |} :: S :: existential_set {{ ocaml - { let v = mk_kid "n" $startpos $endpos in - let atom_id = mk_id (Id "atom") $startpos $endpos in - let atom_of_v = mk_typ (ATyp_app (atom_id, [mk_typ (ATyp_var v) $startpos $endpos])) $startpos $endpos in - mk_typ (ATyp_exist ([v], NC_aux (NC_set (v, [[num_list]]), loc $startpos($2) $endpos($2)), atom_of_v)) $startpos $endpos } }} - | { kid_list . atyp } :: S :: existential_true {{ ocaml - { mk_typ (ATyp_exist ([[kid_list]], NC_aux (NC_true, loc $startpos $endpos), [[atyp]])) $startpos $endpos } }} - | { kid_list , nc . atyp } :: :: exist - | { base_effect1 , .. , base_effectn } :: :: set {{ com effect set }} - | pure :: M :: pure {{ com sugar for empty effect set }} {{ icho [] }} - - -atyp :: 'ATyp_' ::= - {{ com expressions of all kinds, to be translated to types, nats, orders, and effects after parsing }} - {{ aux _ l }} - | atomic_typ :: S :: atomic {{ ocaml [[atomic_typ]] }} {{ quotient-remove }} - | atyp1 * atyp2 :: :: times {{ com product }} - | atyp1 + atyp2 :: :: sum {{ com sum }} - | atyp1 - atyp2 :: :: minus {{ com subtraction }} - | 2** atyp :: :: exp {{ com exponential }} - | neg atyp :: :: neg {{ com Internal (but not M as I want a datatype constructor) negative nexp }} - | atyp1 -> atyp2 effect atyp3 :: :: fn - {{ com Function type (first-order only in user code), last atyp is an effect }} - - -% plus more for l-value/r-value pairs, as introduced by the L3 'compound' declarations ... ref typ - -%typ_lib :: 'Typ_lib_' ::= -% {{ com library types and syntactic sugar for them }} -% {{ aux _ l }} %{{ auxparam 'a }} -% boring base types: -% | unit :: :: unit {{ com unit type with value $()$ }} -% | bool :: :: bool {{ com booleans $[[true]]$ and $[[false]]$ }} -% | bit :: :: bit {{ com pure bit values (not mutable bits) }} -% experimentally trying with two distinct types of bool and bit ... -% | nat :: :: nat {{ com natural numbers 0,1,2,... }} -% | string :: :: string {{ com UTF8 strings }} -% finite subranges of nat -% | enum nexp1 nexp2 order :: :: enum {{ com natural numbers [[atyp2]] .. [[atyp2]]+[[atyp1]]-1, ordered by order }} -% | [ nexp ] :: :: enum1 {{ com sugar for \texttt{enum nexp 0 inc} }} -% | [ nexp : nexp' ] :: :: enum2 {{ com sugar for \texttt{enum (nexp'-nexp+1) nexp inc} or \texttt{enum (nexp-nexp'+1) nexp' dec} }} -% use .. not - to avoid ambiguity with nexp - -% total maps and vectors indexed by finite subranges of nat -% | vector nexp1 nexp2 order atyp :: :: vector {{ com vector of [[atyp]], indexed by natural range }} -% probably some sugar for vector types, using [ ] similarly to enums: -% (but with .. not : in the former, to avoid confusion...) -% | atyp [ nexp ] :: :: vector2 {{ com sugar for vector indexed by [ [[atyp]] ] }} -% | atyp [ nexp : nexp' ] :: :: vector3 {{ com sugar for vector indexed by [ [[atyp]]..[[atyp']] ] }} -% ...so bit [ nexp ] etc is just an instance of that -% | list atyp :: :: list {{ com list of [[atyp]] }} -% | set atyp :: :: set {{ com finite set of [[atyp]] }} -% | reg atyp :: :: reg {{ com mutable register components holding [[atyp]] }} -% "reg t" is basically the ML "t ref" -% not sure how first-class it should be, though -% use "reg word32" etc for the types of vanilla registers - -% parsing -% -% ATyp_tup <= ATyp_tup -% ATyp_fn right ATyp_fn -% ATyp_fn <= ATyp_tup - -grammar - -n_constraint :: 'NC_' ::= - {{ com constraint over kind $[[Nat]]$ }} - {{ aux _ l }} - | atyp = atyp' :: :: fixed - | atyp >= atyp' :: :: bounded_ge - | atyp '<=' atyp' :: :: bounded_le - | kid 'IN' { num1 , ... , numn } :: :: nat_set_bounded - -% Note only id on the left and constants on the right in a -% finite-set-bound, as we don't think we need anything more - -kinded_id :: 'KOpt_' ::= - {{ com optionally kind-annotated identifier }} - {{ aux _ l }} - | kid :: :: none {{ com identifier }} - | kind kid :: :: kind {{ com kind-annotated variable }} - -quant_item :: 'QI_' ::= - {{ com Either a kinded identifier or a nexp constraint for a typquant }} - {{ aux _ l }} - | kinded_id :: :: id {{ com An optionally kinded identifier }} - | n_constraint :: :: const {{ com A constraint for this type }} - -typquant :: 'TypQ_' ::= - {{ com type quantifiers and constraints}} - {{ aux _ l }} - | forall quant_item1 , ... , quant_itemn . :: :: tq {{ texlong }} - | :: :: no_forall {{ com sugar, omitting quantifier and constraints }} - -typschm :: 'TypSchm_' ::= - {{ com type scheme }} - {{ aux _ l }} - | typquant atyp :: :: ts - - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Type definitions % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -grammar -%ctor_def :: 'CT_' ::= -% {{ com Datatype constructor definition clause }} -% {{ aux _ l }} -% | id : typschm :: :: ct -% but we could get away with disallowing constraints in typschm, we -% think - if it's useful to do that - - name_scm_opt :: 'Name_sect_' ::= - {{ com Optional variable-naming-scheme specification for variables of defined type }} - {{ aux _ l }} - | :: :: none - | [ name = regexp ] :: :: some - -type_union :: 'Tu_' ::= - {{ com Type union constructors }} - {{ aux _ l }} - | id :: :: id - | atyp id :: :: ty_id - -type_def :: 'TD_' ::= - {{ com Type definition body }} - {{ aux _ l }} - | typedef id name_scm_opt = typschm :: :: abbrev - {{ com type abbreviation }} {{ texlong }} - | typedef id name_scm_opt = const struct typquant { atyp1 id1 ; ... ; atypn idn semi_opt } :: :: record - {{ com struct type definition }} {{ texlong }} - | typedef id name_scm_opt = const union typquant { type_union1 ; ... ; type_unionn semi_opt } :: :: variant - {{ com union type definition}} {{ texlong }} - | typedef id name_scm_opt = enumerate { id1 ; ... ; idn semi_opt } :: :: enum - {{ com enumeration type definition}} {{ texlong }} - - | typedef id = register bits [ atyp : atyp' ] { index_range1 : id1 ; ... ; index_rangen : idn } -:: :: register {{ com register mutable bitfield type definition }} {{ texlong }} - -kind_def :: 'KD_' ::= - {{ com Definition body for elements of kind; many are shorthands for type\_defs }} - {{ aux _ l }} - | Def kind id name_scm_opt = typschm :: :: abbrev - {{ com type abbreviation }} {{ texlong }} - | Def kind id name_scm_opt = const struct typquant { atyp1 id1 ; ... ; atypn idn semi_opt } :: :: record - {{ com struct type definition }} {{ texlong }} - | Def kind id name_scm_opt = const union typquant { type_union1 ; ... ; type_unionn semi_opt } :: :: variant - {{ com union type definition}} {{ texlong }} - | Def kind id name_scm_opt = enumerate { id1 ; ... ; idn semi_opt } :: :: enum - {{ com enumeration type definition}} {{ texlong }} - - | Def kind id = register bits [ atyp : atyp' ] { index_range1 : id1 ; ... ; index_rangen : idn } -:: :: register {{ com register mutable bitfield type definition }} {{ texlong }} - - -% also sugar [ nexp ] - - -index_range :: 'BF_' ::= {{ com index specification, for bitfields in register types}} - {{ aux _ l }} - | num :: :: 'single' {{ com single index }} - | num1 : num2 :: :: range {{ com index range }} - | index_range1 , index_range2 :: :: concat {{ com concatenation of index ranges }} - -% - - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Literals % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - -grammar - -lit :: 'L_' ::= - {{ com Literal constant }} - {{ aux _ l }} - | ( ) :: :: unit {{ com $() : [[unit]]$ }} -%Presumably we want to remove bitzero and bitone ? - | bitzero :: :: zero {{ com $[[bitzero]] : [[bit]]$ }} - | bitone :: :: one {{ com $[[bitone]] : [[bit]]$ }} - | true :: :: true {{ com $[[true]] : [[bool]]$ }} - | false :: :: false {{ com $[[false]] : [[bool]]$ }} - | num :: :: num {{ com natural number constant }} - | hex :: :: hex {{ com bit vector constant, C-style }} - {{ com hex and bin are constant bit vectors, C-style }} - | bin :: :: bin {{ com bit vector constant, C-style }} - | undefined :: :: undef {{ com undefined value }} - | string :: :: string {{ com string constant }} - -semi_opt {{ tex \ottnt{;}^{?} }} :: 'semi_' ::= {{ phantom }} - {{ ocaml bool }} - {{ lem bool }} - {{ hol bool }} - {{ com Optional semi-colon }} - | :: :: no - {{ hol F }} - {{ ocaml false }} - {{ lem false }} - | ';' :: :: yes - {{ hol T }} - {{ ocaml true }} - {{ lem true }} - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Patterns % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - -pat :: 'P_' ::= - {{ com Pattern }} - {{ aux _ l }} - | lit :: :: lit - {{ com literal constant pattern }} - | _ :: :: wild - {{ com wildcard }} - | ( pat as id ) :: :: as - {{ com named pattern }} - | ( atyp ) pat :: :: typ - {{ com typed pattern }} - - | id :: :: id - {{ com identifier }} - - | id ( pat1 , .. , patn ) :: :: app - {{ com union constructor pattern }} - - | { fpat1 ; ... ; fpatn semi_opt } :: :: record - {{ com struct pattern }} - - | [ pat1 , .. , patn ] :: :: vector - {{ com vector pattern }} - - | [ num1 = pat1 , .. , numn = patn ] :: :: vector_indexed - {{ com vector pattern (with explicit indices) }} - - | pat1 : .... : patn :: :: vector_concat - {{ com concatenated vector pattern }} - - | ( pat1 , .... , patn ) :: :: tup - {{ com tuple pattern }} - | [|| pat1 , .. , patn ||] :: :: list - {{ com list pattern }} - | ( pat ) :: S :: paren -{{ ichlo [[pat]] }} - -fpat :: 'FP_' ::= - {{ com Field pattern }} - {{ aux _ l }} - | id = pat :: :: Fpat - -parsing -P_app <= P_app -P_app <= P_as - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Expressions % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - - - -grammar - -exp :: 'E_' ::= - {{ com Expression }} - {{ aux _ l }} - - | { exp1 ; ... ; expn } :: :: block {{ com block (parsing conflict with structs?) }} -% maybe we really should have indentation-sensitive syntax :-) (given that some of the targets do) - - | nondet { exp1 ; ... ; expn } :: :: nondet {{ com block that can evaluate the contained expressions in any ordering }} - - | id :: :: id - {{ com identifier }} - - | lit :: :: lit - {{ com literal constant }} - - | ( atyp ) exp :: :: cast - {{ com cast }} - - - | id exp :: S :: tup_app {{ ichlo [[id]] ( [[exp]] ) }} {{ com No extra parens needed when exp is a tuple }} - | id ( exp1 , .. , expn ) :: :: app - {{ com function application }} -% Note: fully applied function application only - - | exp1 id exp2 :: :: app_infix - {{ com infix function application }} - - | ( exp1 , .... , expn ) :: :: tuple - {{ com tuple }} - - | if exp1 then exp2 else exp3 :: :: if - {{ com conditional }} - - | if exp1 then exp2 :: S :: ifnoelse {{ icho [[ if exp1 then exp2 else unit ]] }} - - | foreach id from exp1 to exp2 by exp3 in atyp exp4 :: :: for {{ com loop }} - | foreach id from exp1 to exp2 by exp3 exp4 :: S :: forup {{ ichlo [[ foreach id from exp1 to exp2 by exp3 in inc exp4 ]] }} - | foreach id from exp1 to exp2 exp3 :: S :: forupbyone {{ icho [[ foreach id from exp1 to exp2 by 1 exp4 ]] }} - | foreach id from exp1 downto exp2 by exp3 exp4 :: S :: fordown {{ icho [[ foreach id from exp1 to exp2 by ( - exp3 ) exp4 ]] }} - | foreach id from exp1 downto exp2 exp3 :: S :: fordownbyone {{ icho [[ foreach id from exp1 downto exp2 by 1 exp4 ]] }} - -% vectors - | [ exp1 , ... , expn ] :: :: vector {{ com vector (indexed from 0) }} -% order comes from global command-line option??? -% here the expi are of type 'a and the result is a vector of 'a, whereas in exp1 : ... : expn -% the expi and the result are both of type vector of 'a - - | [ exp1 , ... , expn opt_default ] :: :: vector_indexed {{ com vector (indexed consecutively) }} -% num1 .. numn must be a consecutive list of naturals - -% we pick [ ] not { } for vector literals for consistency with their -% array-like access syntax, in contrast to the C which has funny -% syntax for array literals. We don't have to preserve [ ] for lists -% as we don't expect to use lists very much. - - | exp [ exp' ] :: :: vector_access - {{ com vector access }} - - | exp [ exp1 '..' exp2 ] :: :: vector_subrange - {{ com subvector extraction }} - % do we want to allow a comma-separated list of such thingies? - - | [ exp with exp1 = exp2 ] :: :: vector_update - {{ com vector functional update }} - - | [ exp with exp1 : exp2 = exp3 ] :: :: vector_update_subrange - {{ com vector subrange update (with vector)}} - % do we want a functional update form with a comma-separated list of such? - - | exp : exp2 :: :: vector_append - {{ com vector concatenation }} - -% lists - | [|| exp1 , .. , expn ||] :: :: list - {{ com list }} - | exp1 '::' exp2 :: :: cons - {{ com cons }} - - -% const unions - -% const structs - -% TODO - - | { fexps } :: :: record - {{ com struct }} - | { exp with exp1 ; .. ; expn } :: :: record_update - {{ com functional update of struct }} - | exp . id :: :: field - {{ com field projection from struct }} - -%Expressions for creating and accessing vectors - - - -% map : forall 'x 'y ''N. ('x -> 'y) -> vector ''N 'x -> vector ''N 'y -% zip : forall 'x 'y ''N. vector ''N 'x -> vector ''N 'y -> vector ''N ('x*'y) -% foldl : forall 'x 'y ''N. ('x 'y -> 'y) -> vector ''N 'x -> 'y -> 'y -% foldr : forall 'x 'y ''N. ('x 'y -> 'y) -> 'y -> vector ''N 'x -> 'y -% foldmap : forall 'x 'y 'z ''N. ((x,y) -> (x,z)) -> x -> vector ''N y -> vector ''N z -%(or unzip) - -% and maybe with nice syntax - - | switch exp { case pexp1 ... case pexpn } :: :: case - {{ com pattern matching }} - | letbind in exp :: :: let - {{ com let expression }} - - | exp := exp' :: :: assign - {{ com imperative assignment }} - - | sizeof atyp :: :: sizeof - | exit exp :: :: exit - | return exp :: :: return - | assert ( exp , exp' ) :: :: assert - - | ( exp ) :: S :: paren {{ ichlo [[exp]] }} - - -lexp :: 'LEXP_' ::= {{ com lvalue expression, can't occur out of the parser }} - {{ aux _ l }} -% {{ aux _ annot }} {{ auxparam 'a }} - | id :: :: id - {{ com identifier }} - | id ( exp1 , .. , expn ) :: :: mem - | id exp :: S :: mem_tup {{ ichlo [[id (exp)]] }} - | lexp [ exp ] :: :: vector {{ com vector element }} - | lexp [ exp1 : exp2 ] :: :: vector_range {{ com subvector }} - % maybe comma-sep such lists too - | lexp . id :: :: field {{ com struct field }} - - -fexp :: 'FE_' ::= - {{ com Field-expression }} - {{ aux _ l }} -% {{ aux _ annot }} {{ auxparam 'a }} - | id = exp :: :: Fexp - -fexps :: 'FES_' ::= - {{ com Field-expression list }} - {{ aux _ l }} -% {{ aux _ annot }} {{ auxparam 'a }} - | fexp1 ; ... ; fexpn semi_opt :: :: Fexps - -opt_default :: 'Def_val_' ::= - {{ com Optional default value for indexed vectors, to define a defualt value for any unspecified positions in a sparse map }} - {{ aux _ l }} - | :: :: empty - | ; default = exp :: :: dec - -pexp :: 'Pat_' ::= - {{ com Pattern match }} - {{ aux _ l }} -% {{ aux _ annot }} {{ auxparam 'a }} - | pat -> exp :: :: exp -% apparently could use -> or => for this. - -%% % psexp :: 'Pats' ::= -%% % {{ com Multi-pattern matches }} -%% % {{ aux _ l }} -%% % | pat1 ... patn -> exp :: :: exp - - -parsing - -%P_app right LB_Let_val - -%%P_app <= Fun - -%%Fun right App -%%Function right App -E_case right E_app -E_let right E_app - -%%Fun <= Field -%%Function <= Field -E_app <= E_field -E_case <= E_field -E_let <= E_field - -E_app left E_app - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Function definitions % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%%%% old Lem style %%%%%% -grammar -%% % lem_tannot_opt_aux :: 'LEM_Typ_annot_' ::= -%% % {{ com Optional type annotations }} -%% % | :: :: none -%% % | : typ :: :: some -%% % -%% % lem_tannot_opt {{ tex \ottnt{tannot}^? }} :: 'LEM_Typ_annot_' ::= -%% % {{ com location-annotated optional type annotations }} -%% % | tannot_opt_aux l :: :: aux -%% % -%% % lem_funcl :: 'LEM_FCL' ::= -%% % {{ com Function clauses }} -%% % {{ aux _ l }} -%% % | id pat1 ... patn tannot_opt = exp :: :: Funcl -%% % -%% % lem_letbind :: 'LEM_LB_' ::= -%% % {{ com Let bindings }} -%% % {{ aux _ l }} -%% % | pat tannot_opt = exp :: :: Let_val -%% % {{ com Value bindings }} -%% % | lem_funcl :: :: Let_fun -%% % {{ com Function bindings }} -%% % -%% % -%% % grammar -%% % lem_val_def :: 'LEM_VD' ::= -%% % {{ com Value definitions }} -%% % {{ aux _ l }} -%% % | let lem_letbind :: :: Let_def -%% % {{ com Non-recursive value definitions }} -%% % | let rec lem_funcl1 and ... and lem_funcln :: :: Let_rec -%% % {{ com Recursive function definitions }} -%% % -%% % lem_val_spec :: 'LEM_VS' ::= -%% % {{ com Value type specifications }} -%% % {{ aux _ l }} -%% % | val x_l : typschm :: :: Val_spec - -%%%%% C-ish style %%%%%%%%%% - -tannot_opt :: 'Typ_annot_opt_' ::= - {{ com Optional type annotation for functions}} - {{ aux _ l }} -% {{ aux _ annot }} {{ auxparam 'a }} - | :: :: none - | typquant atyp :: :: some - -rec_opt :: 'Rec_' ::= - {{ com Optional recursive annotation for functions }} - {{ aux _ l }} - | :: :: nonrec {{ com non-recursive }} - | rec :: :: rec {{ com recursive }} - -effect_opt :: 'Effect_opt_' ::= - {{ com Optional effect annotation for functions }} - {{ aux _ l }} -% {{ aux _ annot }} {{ auxparam 'a }} - | :: :: pure {{ com sugar for empty effect set }} - | effectkw atyp :: :: effect - -funcl :: 'FCL_' ::= - {{ com Function clause }} - {{ aux _ l }} -% {{ aux _ annot }} {{ auxparam 'a }} - | id pat = exp :: :: Funcl - - -fundef :: 'FD_' ::= - {{ com Function definition}} - {{ aux _ l }} -% {{ aux _ annot }} {{ auxparam 'a }} - | function rec_opt tannot_opt effect_opt funcl1 and ... and funcln :: :: function {{ texlong }} -% {{ com function definition }} -% TODO note that the typ in the tannot_opt is the *result* type, not -% the type of the whole function. The argument type comes from the -% pattern in the funcl -% TODO the above is ok for single functions, but not for mutually -% recursive functions - the tannot_opt scopes over all the funcli, -% which is ok for the typ_quant part but not for the typ part - -letbind :: 'LB_' ::= - {{ com Let binding }} - {{ aux _ l }} -% {{ aux _ annot }} {{ auxparam 'a }} - | let typschm pat = exp :: :: val_explicit - {{ com value binding, explicit type ([[pat]] must be total)}} - | let pat = exp :: :: val_implicit - {{ com value binding, implicit type ([[pat]] must be total)}} - - -val_spec :: 'VS_' ::= - {{ com Value type specification }} - {{ aux _ l }} -% {{ aux _ annot }} {{ auxparam 'a }} - | val typschm id :: :: val_spec - | val extern typschm id :: :: extern_no_rename - | val extern typschm id = string :: :: extern_spec - -default_typing_spec :: 'DT_' ::= - {{ com Default kinding or typing assumption, and default order for literal vectors and vector shorthands }} - {{ aux _ l }} -% {{ aux _ annot }} {{ auxparam 'a }} - | default base_kind kid :: :: kind - | default base_kind atyp :: :: order - | default typschm id :: :: typ -% The intended semantics of these is that if an id in binding position -% doesn't have a kind or type annotation, then we look through the -% default regexps (in order from the beginning) and pick the first -% assumption for which id matches the regexp, if there is one. -% Otherwise we try to infer. Perhaps warn if there are multiple matches. -% For example, we might often have default Type ['alphanum] - -scattered_def :: 'SD_' ::= - {{ com Function and type union definitions that can be spread across - a file. Each one must end in $[[end id]]$ }} - {{ aux _ l }} - | scattered function rec_opt tannot_opt effect_opt id :: :: scattered_function {{ texlong }} {{ com scattered function definition header }} - - | function clause funcl :: :: scattered_funcl -{{ com scattered function definition clause }} - - | scattered typedef id name_scm_opt = const union typquant :: :: scattered_variant {{ texlong }} {{ com scattered union definition header }} - - | union id member type_union :: :: scattered_unioncl {{ com scattered union definition member }} - | end id :: :: scattered_end -{{ com scattered definition end }} - -dec_spec :: 'DEC_' ::= - {{ com Register declarations }} - {{ aux _ l }} - | register atyp id :: :: reg - | register alias id = exp :: :: alias - | register alias atyp id = exp :: :: typ_alias - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Top-level definitions % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -def :: 'DEF_' ::= - {{ com Top-level definition }} - | kind_def :: :: kind - {{ com definition of named kind identifiers }} - | type_def :: :: type - {{ com type definition }} - | fundef :: :: fundef - {{ com function definition }} - | letbind :: :: val - {{ com value definition }} - | val_spec :: :: spec - {{ com top-level type constraint }} - | default_typing_spec :: :: default - {{ com default kind and type assumptions }} - | scattered_def :: :: scattered - {{ com scattered definition }} - | dec_spec :: :: reg_dec - {{ com register declaration }} - -defs :: '' ::= - {{ com Definition sequence }} - | def1 .. defn :: :: Defs - - - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Machinery for typing rules % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -%% %% -%% %% -%% %% grammar -%% %% -%% %% -%% %% p :: 'Path_' ::= -%% %% {{ com Unique paths }} -%% %% | x1 . .. xn . x :: :: def -%% %% | __list :: :: list -%% %% {{ tex \ottkw{\_\_list} }} -%% %% | __bool :: :: bool -%% %% {{ tex \ottkw{\_\_bool} }} -%% %% | __num :: :: num -%% %% {{ tex \ottkw{\_\_num} }} -%% %% | __set :: :: set -%% %% {{ tex \ottkw{\_\_set} }} -%% %% | __string :: :: string -%% %% {{ tex \ottkw{\_\_string} }} -%% %% | __unit :: :: unit -%% %% {{ tex \ottkw{\_\_unit} }} -%% %% | __bit :: :: bit -%% %% {{ tex \ottkw{\_\_bit} }} -%% %% | __vector :: :: vector -%% %% {{ tex \ottkw{\_\_vector} }} -%% %% %TODO morally, delete the above - but what are the __ things for? -%% %% % cleaner to declare early in the library? -%% %% -%% %% t_subst {{ tex \ensuremath{\sigma} }} :: '' ::= {{ phantom }} -%% %% {{ hol (a # t) list }} -%% %% {{ lem list (tnvar * t) }} -%% %% {{ com Type variable substitutions }} -%% %% | { tnvar1 |-> t1 .. tnvarn |-> tn } :: :: T_subst -%% %% {{ ocaml (assert false) }} -%% %% {{ lem ([[tnvar1 t1 .. tnvarn tn]]) }} -%% %% {{ hol ([[tnvar1 t1 .. tnvarn tn]]) }} -%% %% -%% %% t , u :: 'T_' ::= -%% %% {{ com Internal types }} -%% %% | a :: :: var -%% %% | t1 -> t2 :: :: fn -%% %% | t1 * .... * tn :: :: tup -%% %% | p t_args :: :: app -%% %% | ne :: :: len -%% %% | t_subst ( t ) :: M :: subst_app -%% %% {{ com Multiple substitutions }} -%% %% {{ ocaml (assert false) }} -%% %% {{ hol (t_subst_t [[t_subst]] [[t]]) }} -%% %% {{ lem (t_subst_t [[t_subst]] [[t]]) }} -%% %% | t_subst ( tnv ) :: M :: var_subst_app -%% %% {{ com Single variable substitution }} -%% %% {{ ocaml (assert false) }} -%% %% {{ hol (t_subst_tnv [[t_subst]] [[tnv]]) }} -%% %% {{ lem (t_subst_tnv [[t_subst]] [[tnv]]) }} -%% %% | curry ( t_multi , t ) :: M :: multifn -%% %% {{ com Curried, multiple argument functions }} -%% %% {{ ocaml (assert false) }} -%% %% {{ hol (FOLDR T_fn [[t]] [[t_multi]]) }} -%% %% {{ lem (List.fold_right T_fn [[t_multi]] [[t]]) }} -%% %% -%% %% ne :: 'Ne_' ::= -%% %% {{ com internal numeric expressions }} -%% %% | N :: :: var -%% %% | nat :: :: const -%% %% | ne1 * ne2 :: :: mult -%% %% | ne1 + ne2 :: :: add -%% %% | ( - ne ) :: :: unary -%% %% | normalize ( ne ) :: M :: normalize -%% %% {{ ocaml (assert false) }} -%% %% {{ hol ARB }} -%% %% {{ lem (normalize [[ne]] ) }} -%% %% | ne1 + ... + nen :: M :: addmany -%% %% {{ ocaml (assert false) }} -%% %% {{ hol ARB }} -%% %% {{ lem (sumation_nes [[ne1...nen]]) }} -%% %% | bitlength ( bin ) :: M :: cbin -%% %% {{ ocaml (asssert false) }} -%% %% {{ hol ARB }} -%% %% {{ lem (blength [[bin]]) }} -%% %% | bitlength ( hex ) :: M :: chex -%% %% {{ ocaml (assert false) }} -%% %% {{ hol ARB }} -%% %% {{ lem (hlength [[hex]]) }} -%% %% | length ( pat1 ... patn ) :: M :: cpat -%% %% {{ ocaml (assert false) }} -%% %% {{ hol ARB }} -%% %% {{ lem (Ne_const (List.length [[pat1...patn]])) }} -%% %% | length ( exp1 ... expn ) :: M :: cexp -%% %% {{ hol ARB }} -%% %% {{ ocaml (assert false) }} -%% %% {{ lem (Ne_const (List.length [[exp1...expn]])) }} -%% %% -%% %% t_args :: '' ::= -%% %% {{ com Lists of types }} -%% %% | t1 .. tn :: :: T_args -%% %% | t_subst ( t_args ) :: M :: T_args_subst_app -%% %% {{ com Multiple substitutions }} -%% %% {{ ocaml (assert false) }} -%% %% {{ hol (t_subst_t_args [[t_subst]] [[t_args]]) }} -%% %% {{ lem (t_subst_t_args [[t_subst]] [[t_args]]) }} -%% %% -%% %% t_multi :: '' ::= {{ phantom }} -%% %% {{ hol t list }} -%% %% {{ ocaml t list }} -%% %% {{ lem list t }} -%% %% {{ com Lists of types }} -%% %% | ( t1 * .. * tn ) :: :: T_multi -%% %% {{ hol [[t1..tn]] }} -%% %% {{ lem [[t1..tn]] }} -%% %% | t_subst ( t_multi ) :: M :: T_multi_subst_app -%% %% {{ com Multiple substitutions }} -%% %% {{ ocaml (assert false) }} -%% %% {{ hol (MAP (t_subst_t [[t_subst]]) [[t_multi]]) }} -%% %% {{ lem (List.map (t_subst_t [[t_subst]]) [[t_multi]]) }} -%% %% -%% %% nec :: '' ::= -%% %% {{ com Numeric expression constraints }} -%% %% | ne < nec :: :: lessthan -%% %% | ne = nec :: :: eq -%% %% | ne <= nec :: :: lteq -%% %% | ne :: :: base -%% %% -%% %% parsing -%% %% T_fn right T_fn -%% %% T_tup <= T_multi -%% %% -%% %% embed -%% %% {{ lem -%% %% -%% %% val t_subst_t : list (tnv * t) -> t -> t -%% %% val t_subst_tnv : list (tnv * t) -> tnv -> t -%% %% val ftv_t : t -> list tnv -%% %% val ftv_tm : list t -> list tnv -%% %% val ftv_s : list (p*tnv) -> list tnv -%% %% val compatible_overlap : list (x*t) -> bool -%% %% -%% %% (*TODO Should this normalize following the implementation? And blength and hlength need a means of implementation*) -%% %% let normalize n = n -%% %% -%% %% let blength (_,bit) = Ne_const 8 -%% %% let hlength (_,bit) = Ne_const 8 -%% %% -%% %% let rec sumation_nes nes = match nes with -%% %% | [ a; b] -> Ne_add a b -%% %% | x :: y -> Ne_add x (sumation_nes y) -%% %% end -%% %% -%% %% }} -%% %% -%% %% grammar -%% %% -%% %% -%% %% names :: '' ::= {{ phantom }} -%% %% {{ hol x set }} -%% %% {{ lem set x }} -%% %% {{ ocaml Set.Make(String).t }} -%% %% {{ com Sets of names }} -%% %% | { x1 , .. , xn } :: :: Names -%% %% {{ hol (LIST_TO_SET [[x1..xn]]) }} -%% %% {{ lem (set_from_list [[x1..xn]]) }} -%% %% -%% %% semC {{ tex \ensuremath{\mathcal{C} } }} :: '' ::= -%% %% {{ hol (p#tnv) list }} -%% %% {{ lem list (p*tnv) }} -%% %% % {{ com Typeclass constraint lists }} -%% %% % | ( p1 tnv1 ) .. ( pn tnvn ) :: :: SemC_concrete -%% %% % {{ hol ([[p1 tnv1..pn tnvn]]) }} -%% %% % {{ lem ([[p1 tnv1..pn tnvn]]) }} -%% %% -%% %% env_tag :: '' ::= -%% %% {{ com Tags for the (non-constructor) value descriptions }} -%% %% % | method :: :: method -%% %% % {{ com Bound to a method }} -%% %% | val :: :: spec -%% %% {{ com Specified with val }} -%% %% | let :: :: def -%% %% {{ com Defined with let or indreln }} -%% %% -%% %% v_desc :: 'V_' ::= -%% %% {{ com Value descriptions }} -%% %% | < forall tnvs . t_multi -> p , ( x of names ) > :: :: constr -%% %% {{ com Constructors }} -%% %% | < forall tnvs . semC => t , env_tag > :: :: val -%% %% {{ com Values }} -%% %% -%% %% f_desc :: 'F_' ::= -%% %% | < forall tnvs . p -> t , ( x of names ) > :: :: field -%% %% {{ com Fields }} -%% %% -%% %% embed -%% %% {{ hol -%% %% load "fmaptreeTheory"; -%% %% val _ = -%% %% Hol_datatype -%% %% `env_body = <| env_p : x|->p; env_f : x|->f_desc; env_v : x|->v_desc |>`; -%% %% -%% %% val _ = Define ` -%% %% env_union e1 e2 = -%% %% let i1 = item e1 in -%% %% let m1 = map e1 in -%% %% let i2 = item e2 in -%% %% let m2 = map e2 in -%% %% FTNode <| env_p:=FUNION i1.env_p i2.env_p; -%% %% env_f:=FUNION i1.env_f i2.env_f; -%% %% env_v:=FUNION i1.env_v i2.env_v |> -%% %% (FUNION m1 m2)`; -%% %% }} -%% %% {{ lem -%% %% type env = -%% %% | EnvEmp -%% %% | Env of (map x env) * (map x p) * (map x f_desc) * (map x v_desc) -%% %% -%% %% val env_union : env -> env -> env -%% %% let env_union e1 e2 = -%% %% match (e1,e2) with -%% %% | (EnvEmp,e2) -> e2 -%% %% | (e1,EnvEmp) -> e1 -%% %% | ((Env Em1 Ep1 Ef1 Ev1),(Env Em2 Ep2 Ef2 Ev2)) -> -%% %% Env(union_map Em1 Em2) (union_map Ep1 Ep2) (union_map Ef1 Ef2) (union_map Ev1 Ev2) -%% %% end -%% %% -%% %% }} -%% %% -%% %% grammar -%% %% -%% %% xs :: '' ::= {{ phantom }} -%% %% {{ hol string list }} -%% %% {{ lem list string }} -%% %% | x1 .. xn :: :: Xs -%% %% {{ hol [[x1..xn]] }} -%% %% {{ lem [[x1..xn]] }} -%% %% -%% %% %TODO: no clue what the following are: -%% %% S_c {{ tex {\ensuremath{ {\Sigma}^{\mathcal{C} } } } }} :: '' ::= {{ phantom }} -%% %% {{ hol (p#t) list }} -%% %% {{ lem list (p*t) }} -%% %% {{ com Typeclass constraints }} -%% %% | { ( p1 t1 ) , .. , ( pn tn ) } :: :: S_concrete -%% %% {{ hol [[p1 t1 .. pn tn]] }} -%% %% {{ lem [[p1 t1 .. pn tn]] }} -%% %% | S_c1 union .. union S_cn :: M :: S_union -%% %% {{ hol (FLAT [[S_c1..S_cn]]) }} -%% %% {{ lem (List.flatten [[S_c1..S_cn]]) }} -%% %% {{ ocaml assert false }} -%% %% -%% %% S_N {{ tex { \ensuremath{ {\Sigma}^{\mathcal{N} } } } }} :: '' ::= {{ phantom }} -%% %% {{ hol nec list }} -%% %% {{ lem list nec }} -%% %% {{ com nexp constraint lists }} -%% %% | { nec1 , .. , necn } :: :: Sn_concrete -%% %% {{ hol [[nec1 .. necn]] }} -%% %% {{ lem [[nec1 .. necn]] }} -%% %% | S_N1 union .. union S_Nn :: M :: SN_union -%% %% {{ hol (FLAT [[S_N1..S_Nn]]) }} -%% %% {{ lem (List.flatten [[S_N1..S_Nn]]) }} -%% %% {{ ocaml assert false }} -%% %% -%% %% -%% %% E :: '' ::= {{ phantom }} -%% %% {{ hol ((string,env_body) fmaptree) }} -%% %% -%% %% -%% %% %TODO: simplify by removing E_m throughout? And E_p?? -%% %% {{ lem env }} -%% %% {{ com Environments }} -%% %% | < E_m , E_p , E_f , E_x > :: :: E -%% %% {{ hol (FTNode <|env_p:=[[E_p]]; env_f:=[[E_f]]; env_v:=[[E_x]]|> ([[E_m]])) }} -%% %% {{ lem (Env [[E_m]] [[E_p]] [[E_f]] [[E_x]]) }} -%% %% | E1 u+ E2 :: M :: E_union -%% %% {{ hol (env_union [[E1]] [[E2]]) }} -%% %% {{ lem (env_union [[E1]] [[E2]]) }} -%% %% {{ ocaml assert false }} -%% %% | empty :: M :: E_empty -%% %% {{ hol (FTNode <|env_p:=FEMPTY; env_f:=FEMPTY; env_v:=FEMPTY|> FEMPTY) }} -%% %% {{ lem EnvEmp }} -%% %% {{ ocaml assert false }} -%% %% -%% %% E_x {{ tex \ottnt{E}^{\textsc{x} } }} :: 'E_x_' ::= {{ phantom }} -%% %% {{ hol (x|-> v_desc) }} -%% %% {{ lem map x v_desc }} -%% %% {{ com Value environments }} -%% %% | { x1 |-> v_desc1 , .. , xn |-> v_descn } :: :: concrete -%% %% {{ hol (FOLDR (\(k1,k2) E. E |+ (k1,k2)) FEMPTY [[x1 v_desc1 .. xn v_descn]]) }} -%% %% {{ lem (List.fold_right (fun (x,v) m -> Pmap.add x v m) [[x1 v_desc1 .. xn v_descn]] Pmap.empty) }} -%% %% | E_x1 u+ .. u+ E_xn :: M :: union -%% %% {{ hol (FOLDR FUNION FEMPTY [[E_x1..E_xn]]) }} -%% %% {{ lem (List.fold_right union_map [[E_x1..E_xn]] Pmap.empty) }} -%% %% {{ ocaml (assert false) }} -%% %% -%% %% E_f {{ tex \ottnt{E}^{\textsc{f} } }} :: 'E_f_' ::= {{ phantom }} -%% %% {{ hol (x |-> f_desc) }} -%% %% {{ lem map x f_desc }} -%% %% {{ com Field environments }} -%% %% | { x1 |-> f_desc1 , .. , xn |-> f_descn } :: :: concrete -%% %% {{ hol (FOLDR (\x E. E |+ x) FEMPTY [[x1 f_desc1 .. xn f_descn]]) }} -%% %% {{ lem (List.fold_right (fun (x,f) m -> Pmap.add x f m) [[x1 f_desc1 .. xn f_descn]] Pmap.empty) }} -%% %% | E_f1 u+ .. u+ E_fn :: M :: union -%% %% {{ hol (FOLDR FUNION FEMPTY [[E_f1..E_fn]]) }} -%% %% {{ lem (List.fold_right union_map [[E_f1..E_fn]] Pmap.empty) }} -%% %% {{ ocaml (assert false) }} -%% %% -%% %% E_m {{ tex \ottnt{E}^{\textsc{m} } }} :: 'E_m_' ::= {{ phantom }} -%% %% {{ hol (string |-> (string,env_body) fmaptree) }} -%% %% {{ lem map x env }} -%% %% % {{ com Module environments }} -%% %% % | { x1 |-> E1 , .. , xn |-> En } :: :: concrete -%% %% % {{ hol (FOLDR (\x E. E |+ x) FEMPTY [[x1 E1 .. xn En]]) }} -%% %% % {{ lem (List.fold_right (fun (x,e) m -> Pmap.add x e m) [[x1 E1 .. xn En]] Pmap.empty) }} -%% %% % -%% %% % _p {{ tex \ottnt{E}^{\textsc{p} } }} :: 'E_p_' ::= {{ phantom }} -%% %% % {{ hol (x |-> p) }} -%% %% % {{ lem map x p }} -%% %% % {{ com Path environments }} -%% %% % | { x1 |-> p1 , .. , xn |-> pn } :: :: concrete -%% %% % {{ hol (FOLDR (\x E. E |+ x) FEMPTY [[x1 p1 .. xn pn]]) }} -%% %% % {{ lem (List.fold_right (fun (x,p) m -> Pmap.add x p m) [[x1 p1 .. xn pn]] Pmap.empty) }} -%% %% % | E_p1 u+ .. u+ E_pn :: M :: union -%% %% % {{ hol (FOLDR FUNION FEMPTY [[E_p1..E_pn]]) }} -%% %% % {{ lem (List.fold_right union_map [[E_p1..E_pn]] Pmap.empty) }} -%% %% % -%% %% % {{ ocaml (assert false) }} -%% %% E_l {{ tex \ottnt{E}^{\textsc{l} } }} :: 'E_l_' ::= {{ phantom }} -%% %% {{ hol (x |-> t) }} -%% %% {{ lem map x t }} -%% %% {{ com Lexical bindings }} -%% %% | { x1 |-> t1 , .. , xn |-> tn } :: :: concrete -%% %% {{ hol (FOLDR (\x E. E |+ x) FEMPTY [[x1 t1 .. xn tn]]) }} -%% %% {{ lem (List.fold_right (fun (x,t) m -> Pmap.add x t m) [[x1 t1 .. xn tn]] Pmap.empty) }} -%% %% | E_l1 u+ .. u+ E_ln :: M :: union -%% %% {{ hol (FOLDR FUNION FEMPTY [[E_l1..E_ln]]) }} -%% %% {{ lem (List.fold_right union_map [[E_l1..E_ln]] Pmap.empty) }} -%% %% {{ ocaml (assert false) }} -%% %% -%% %% tc_abbrev :: 'Tc_abbrev_' ::= {{ phantom }} -%% %% {{ hol t option }} -%% %% {{ lem option t }} -%% %% {{ ocaml t option }} -%% %% {{ com Type abbreviations }} -%% %% | . t :: :: some -%% %% {{ hol (SOME [[t]]) }} -%% %% {{ lem (Some [[t]]) }} -%% %% | :: :: none -%% %% {{ hol NONE }} -%% %% {{ lem None }} -%% %% -%% %% tc_def :: '' ::= -%% %% {{ com Type and class constructor definitions }} -%% %% | tnvs tc_abbrev :: :: Tc_def -%% %% {{ com Type constructors }} -%% %% -%% %% TD {{ tex \ensuremath{\Delta} }} :: 'TD_' ::= {{ phantom }} -%% %% {{ hol p |-> tc_def }} -%% %% {{ lem map p tc_def }} -%% %% {{ com Type constructor definitions }} -%% %% | { p1 |-> tc_def1 , .. , pn |-> tc_defn } :: :: concrete -%% %% {{ hol (FOLDR (\x E. E |+ x) FEMPTY [[p1 tc_def1 .. pn tc_defn]]) }} -%% %% {{ lem (List.fold_right (fun (p,t) m -> Pmap.add p t m) [[p1 tc_def1 .. pn tc_defn]] Pmap.empty) }} -%% %% {{ ocaml (assert false) }} -%% %% | TD1 u+ TD2 :: M :: union -%% %% {{ hol (FUNION [[TD1]] [[TD2]]) }} -%% %% {{ lem (union_map [[TD1]] [[TD2]]) }} -%% %% {{ ocaml (assert false) }} -%% %% -%% %% -%% %% -%% %% D :: 'D_' ::= {{ phantom }} -%% %% {{ hol ((p |-> tc_def) # (p |-> x list) # (inst list)) }} -%% %% {{ lem tdefs}} -%% %% {{ com Global type definition store }} -%% %% | < TD , TC , I > :: :: concrete -%% %% {{ hol ([[TD]], [[TC]], [[I]]) }} -%% %% {{ lem (D [[TD]] [[TC]] [[I]]) }} -%% %% | D1 u+ D2 :: M :: union -%% %% {{ hol (case ([[D1]],[[D2]]) of ((x1,x2,x3),(y1,y2,y3)) => (FUNION x1 y1, FUNION x2 y2, x3 ++ y3)) }} -%% %% {{ lem (union_tcdefs [[D1]] [[D2]]) }} -%% %% {{ ocaml (assert false) }} -%% %% | empty :: M :: empty -%% %% {{ hol (FEMPTY, FEMPTY, []) }} -%% %% {{ lem DEmp }} -%% %% {{ ocaml assert false }} -%% %% -%% %% parsing -%% %% E_union left E_union -%% %% -%% %% embed -%% %% {{ lem -%% %% type tdefs = -%% %% | DEmp -%% %% | D of (map p tc_def) * (map p (list x)) * (set inst) -%% %% -%% %% val union_tcdefs : tdefs -> tdefs -> tdefs -%% %% -%% %% }} - -grammar - -terminals :: '' ::= - | ** :: :: starstar - {{ tex \ensuremath{\mathop{\mathord{*}\mathord{*} } } }} - {{ com \texttt{**} }} - | >= :: :: geq - {{ tex \ensuremath{\geq} }} - {{ com \texttt{>=} }} - | '<=' :: :: leq - {{ tex \ensuremath{\leq} }} - {{ com \texttt{<=} }} - | -> :: :: arrow - {{ tex \ensuremath{\rightarrow} }} - {{ com \texttt{->} }} - | ==> :: :: Longrightarrow - {{ tex \ensuremath{\Longrightarrow} }} - {{ com \texttt{==>} }} - | <| :: :: startrec - {{ tex \ensuremath{\langle|} }} - {{ com \texttt{<|} }} - | |> :: :: endrec - {{ tex \ensuremath{|\rangle} }} - {{ com \texttt{|>} }} - | inter :: :: inter - {{ tex \ensuremath{\cap} }} -% | union :: :: union -% {{ tex \ensuremath{\cup} }} - | u+ :: :: uplus - {{ tex \ensuremath{\uplus} }} - | NOTIN :: :: notin - {{ tex \ensuremath{\not\in} }} - | SUBSET :: :: subset - {{ tex \ensuremath{\subset} }} - | NOTEQ :: :: noteq - {{ tex \ensuremath{\not=} }} - | emptyset :: :: emptyset - {{ tex \ensuremath{\emptyset} }} - | < :: :: lt - {{ tex \ensuremath{\langle} }} - | > :: :: gt - {{ tex \ensuremath{\rangle} }} - | |- :: :: vdash - {{ tex \ensuremath{\vdash} }} - | ' :: :: quote - {{ tex \mbox{'} }} - | |-> :: :: mapsto - {{ tex \ensuremath{\mapsto} }} - | gives :: :: gives - {{ tex \ensuremath{\triangleright} }} - | ~> :: :: leadsto - {{ tex \ensuremath{\leadsto} }} - | => :: :: Rightarrow - {{ tex \ensuremath{\Rightarrow} }} - | -- :: :: dashdash - {{ tex \mbox{--} }} - | empty :: :: empty - {{ tex \ensuremath{\epsilon} }} - | effectkw :: :: effectkw - {{ tex \ottkw{effect} }} - - -formula :: formula_ ::= - | judgement :: :: judgement - - | formula1 .. formulan :: :: dots - -% | E_m ( x ) gives E :: :: lookup_m -% {{ com Module lookup }} -% {{ hol (FLOOKUP [[E_m]] [[x]] = SOME [[E]]) }} -% {{ lem (Pmap.find [[x]] [[E_m]]) = [[E]] }} -% -% | E_p ( x ) gives p :: :: lookup_p -% {{ com Path lookup }} -% {{ hol (FLOOKUP [[E_p]] [[x]] = SOME [[p]]) }} -% {{ lem Pmap.find [[x]] [[E_p]] = [[p]] }} - -%% %% | E_f ( x ) gives f_desc :: :: lookup_f -%% %% {{ com Field lookup }} -%% %% {{ hol (FLOOKUP [[E_f]] [[x]] = SOME [[f_desc]]) }} -%% %% {{ lem Pmap.find [[x]] [[E_f]] = [[f_desc]] }} -%% %% -%% %% | E_x ( x ) gives v_desc :: :: lookup_v -%% %% {{ com Value lookup }} -%% %% {{ hol (FLOOKUP [[E_x]] [[x]] = SOME [[v_desc]]) }} -%% %% {{ lem Pmap.find [[x]] [[E_x]] = [[v_desc]] }} -%% %% -%% %% | E_l ( x ) gives t :: :: lookup_l -%% %% {{ com Lexical binding lookup }} -%% %% {{ hol (FLOOKUP [[E_l]] [[x]] = SOME [[t]]) }} -%% %% {{ lem Pmap.find [[x]] [[E_l]] = [[t]] }} -%% %% -%% %% % | TD ( p ) gives tc_def :: :: lookup_tc -%% %% % {{ com Type constructor lookup }} -%% %% % {{ hol (FLOOKUP [[TD]] [[p]] = SOME [[tc_def]]) }} -%% %% % {{ lem Pmap.find [[p]] [[TD]] = [[tc_def]] }} -%% %% % -%% %% % | TC ( p ) gives xs :: :: lookup_class -%% %% % {{ com Type constructor lookup }} -%% %% % {{ hol (FLOOKUP [[TC]] [[p]] = SOME [[xs]]) }} -%% %% % {{ lem Pmap.find [[p]] [[TC]] = [[xs]] }} -%% %% -%% %% | dom ( E_m1 ) inter dom ( E_m2 ) = emptyset :: :: E_m_disjoint -%% %% {{ hol (DISJOINT (FDOM [[E_m1]]) (FDOM [[E_m2]])) }} -%% %% {{ lem disjoint (Pmap.domain [[E_m1]]) (Pmap.domain [[E_m2]]) }} -%% %% -%% %% | dom ( E_x1 ) inter dom ( E_x2 ) = emptyset :: :: E_x_disjoint -%% %% {{ hol (DISJOINT (FDOM [[E_x1]]) (FDOM [[E_x2]])) }} -%% %% {{ lem disjoint (Pmap.domain [[E_x1]]) (Pmap.domain [[E_x2]]) }} -%% %% -%% %% | dom ( E_f1 ) inter dom ( E_f2 ) = emptyset :: :: E_f_disjoint -%% %% {{ hol (DISJOINT (FDOM [[E_f1]]) (FDOM [[E_f2]])) }} -%% %% {{ lem disjoint (Pmap.domain [[E_f1]]) (Pmap.domain [[E_f2]]) }} -%% %% -%% %% % | dom ( E_p1 ) inter dom ( E_p2 ) = emptyset :: :: E_p_disjoint -%% %% % {{ hol (DISJOINT (FDOM [[E_p1]]) (FDOM [[E_p2]])) }} -%% %% % {{ lem disjoint (Pmap.domain [[E_p1]]) (Pmap.domain [[E_p2]]) }} -%% %% % -%% %% | disjoint doms ( E_l1 , .... , E_ln ) :: :: E_l_disjoint -%% %% {{ hol (FOLDR (\E b. case b of NONE => NONE | SOME s => if DISJOINT (FDOM -%% %% E) s then SOME (FDOM E UNION s) else NONE) (SOME {}) [[E_l1....E_ln]] <> NONE) }} -%% %% {{ lem disjoint_all (List.map Pmap.domain [[E_l1 .... E_ln]]) }} -%% %% {{ com Pairwise disjoint domains }} -%% %% -%% %% | disjoint doms ( E_x1 , .... , E_xn ) :: :: E_x_disjoint_many -%% %% {{ hol (FOLDR (\E b. case b of NONE => NONE | SOME s => if DISJOINT (FDOM -%% %% E) s then SOME (FDOM E UNION s) else NONE) (SOME {}) [[E_x1....E_xn]] <> NONE) }} -%% %% {{ lem disjoint_all (List.map Pmap.domain [[E_x1 .... E_xn]]) }} -%% %% {{ com Pairwise disjoint domains }} -%% %% -%% %% | compatible overlap ( x1 |-> t1 , .. , xn |-> tn ) :: :: E_l_compat -%% %% {{ hol (!__n __m. MEM __m [[x1 t1 .. xn tn]] /\ MEM __n [[x1 t1..xn tn]] /\ (FST __m = FST __n) ==> (SND __m = SND __n)) }} -%% %% {{ lem (compatible_overlap [[x1 t1 .. xn tn]]) }} -%% %% {{ com $(\ottnt{x}_i = \ottnt{x}_j) \ensuremath{\Longrightarrow} (\ottnt{t}_i = \ottnt{t}_j)$ }} -%% %% -%% %% | duplicates ( tnvs ) = emptyset :: :: no_dups_tnvs -%% %% {{ hol (ALL_DISTINCT [[tnvs]]) }} -%% %% {{ lem (duplicates [[tnvs]]) = [ ] }} -%% %% -%% %% | duplicates ( x1 , .. , xn ) = emptyset :: :: no_dups -%% %% {{ hol (ALL_DISTINCT [[x1..xn]]) }} -%% %% {{ lem (duplicates [[x1..xn]]) = [ ] }} -%% %% -%% %% | x NOTIN dom ( E_l ) :: :: notin_dom_l -%% %% {{ hol ([[x]] NOTIN FDOM [[E_l]]) }} -%% %% {{ lem Pervasives.not (Pmap.mem [[x]] [[E_l]]) }} -%% %% -%% %% | x NOTIN dom ( E_x ) :: :: notin_dom_v -%% %% {{ hol ([[x]] NOTIN FDOM [[E_x]]) }} -%% %% {{ lem Pervasives.not (Pmap.mem [[x]] [[E_x]]) }} -%% %% -%% %% | x NOTIN dom ( E_f ) :: :: notin_dom_f -%% %% {{ hol ([[x]] NOTIN FDOM [[E_f]]) }} -%% %% {{ lem Pervasives.not (Pmap.mem [[x]] [[E_f]]) }} -%% %% -%% %% % | p NOTIN dom ( TC ) :: :: notin_dom_tc -%% %% % {{ hol ([[p]] NOTIN FDOM [[TC]]) }} -%% %% % {{ lem Pervasives.not (Pmap.mem [[p]] [[TC]]) }} -%% %% -%% %% | p NOTIN dom ( TD ) :: :: notin_dom_td -%% %% {{ hol ([[p]] NOTIN FDOM [[TD]]) }} -%% %% {{ lem Pervasives.not (Pmap.mem [[p]] [[TD]]) }} -%% %% -%% %% | FV ( t ) SUBSET tnvs :: :: FV_t -%% %% {{ com Free type variables }} -%% %% {{ hol (LIST_TO_SET (ftv_t [[t]]) SUBSET LIST_TO_SET [[tnvs]]) }} -%% %% {{ lem subst (ftv_t [[t]]) [[tnvs]] }} -%% %% -%% %% | FV ( t_multi ) SUBSET tnvs :: :: FV_t_multi -%% %% {{ com Free type variables }} -%% %% {{ hol (LIST_TO_SET (FLAT (MAP ftv_t [[t_multi]])) SUBSET LIST_TO_SET [[tnvs]]) }} -%% %% {{ lem subst (ftv_tm [[t_multi]]) [[tnvs]] }} -%% %% -%% %% | FV ( semC ) SUBSET tnvs :: :: FV_semC -%% %% {{ com Free type variables }} -%% %% {{ hol (LIST_TO_SET (MAP SND [[semC]]) SUBSET LIST_TO_SET [[tnvs]]) }} -%% %% {{ lem subst (ftv_s [[semC]]) [[tnvs]] }} -%% %% -%% %% | inst 'IN' I :: :: inst_in -%% %% {{ hol (MEM [[inst]] [[I]]) }} -%% %% {{ lem ([[inst]] IN [[I]]) }} -%% %% -%% %% | ( p t ) NOTIN I :: :: notin_I -%% %% {{ hol (~?__semC__. MEM (Inst __semC__ [[p]] [[t]]) [[I]]) }} -%% %% {{ lem (Pervasives.not ((Inst [] [[p]] [[t]]) IN [[I]])) }} -%% %% -%% %% | E_l1 = E_l2 :: :: E_l_eqn -%% %% {{ ichl ([[E_l1]] = [[E_l2]]) }} -%% %% -%% %% | E_x1 = E_x2 :: :: E_x_eqn -%% %% {{ ichl ([[E_x1]] = [[E_x2]]) }} -%% %% -%% %% | E_f1 = E_f2 :: :: E_f_eqn -%% %% {{ ichl ([[E_f1]] = [[E_f2]]) }} -%% %% -%% %% | E1 = E2 :: :: E_eqn -%% %% {{ ichl ([[E1]] = [[E2]]) }} -%% %% -%% %% | TD1 = TD2 :: :: TD_eqn -%% %% {{ ichl ([[TD1]] = [[TD2]]) }} -%% %% -%% %% | TC1 = TC2 :: :: TC_eqn -%% %% {{ ichl ([[TC1]] = [[TC2]]) }} -%% %% -%% %% | I1 = I2 :: :: I_eqn -%% %% {{ ichl ([[I1]] = [[I2]]) }} -%% %% -%% %% | names1 = names2 :: :: names_eq -%% %% {{ ichl ([[names1]] = [[names2]]) }} -%% %% -%% %% | t1 = t2 :: :: t_eq -%% %% {{ ichl ([[t1]] = [[t2]]) }} -%% %% -%% %% | t_subst1 = t_subst2 :: :: t_subst_eq -%% %% {{ ichl ([[t_subst1]] = [[t_subst2]]) }} -%% %% -%% %% | p1 = p2 :: :: p_eq -%% %% {{ ichl ([[p1]] = [[p2]]) }} -%% %% -%% %% | xs1 = xs2 :: :: xs_eq -%% %% {{ ichl ([[xs1]] = [[xs2]]) }} -%% %% -%% %% | tnvs1 = tnvs2 :: :: tnvs_eq -%% %% {{ ichl ([[tnvs1]] = [[tnvs2]]) }} - diff --git a/language/l2_rules.ott b/language/l2_rules.ott deleted file mode 100644 index 9e1b79fb..00000000 --- a/language/l2_rules.ott +++ /dev/null @@ -1,424 +0,0 @@ - - -grammar - -mut :: 'mut_' ::= - | immutable :: :: immutable - | mutable :: :: mutable - -lvar :: 'lvar_' ::= - | register typ :: :: register - | enum typ :: :: enum - | local mut typ :: :: local - | union typquant typ :: :: union - | unbound :: :: unbound - - - -G {{ tex \Gamma }}, D {{ tex \Delta }} :: 'G_' ::= {{ com Type environment }} - | empty :: :: empty {{ tex \epsilon }} {{ com Empty context }} - | G , x1 : typ1 , .. , xn : typn :: :: type_list {{ com List of variables and their types }} -% | G , x1 : k1 , .. , xn : kn :: :: kind_list {{ com List of variables and their kinds }} - | G , kid1 , .. , kidn :: :: kid_list -% | G , quant_item1 , .. , quant_itemn :: :: quant_list -% | G , { nec1 , .. , necn } :: :: constraint_list {{ com Constraints }} - | G , G1 .. Gn :: :: merge {{ com Merge or disjoint union }} - | G , id : lvar :: :: add_local - - -formula :: formula_ ::= - | judgement :: :: judgement - | formula1 .. formulan :: :: dots - | G ( id ) = lvar :: :: lookup_id - | G ( typ1 , id ) = typ2 :: :: lookup_record_field - | G ( typ1 ) = typ2 :: :: lookup_typ - | nexp = length [|| exp , exp1 , .. , expn ||] :: :: vector_length - | order_inc :: :: default_order_inc - | order_dec :: :: default_order_dec - | G |= nexp1 <= nexp2 :: :: prove_lteq - -defns - declarative :: '' ::= - -defn - G |- typ1 ~< typ2 :: :: subtype :: subtype_ - {{ com $[[typ1]]$ is a subtype of $[[typ2]]$ }} - {{ tex [[G]] \vdash [[typ1]] \preccurlyeq [[typ2]] }} -by - - ------------------ :: refl -G |- typ ~< typ - ---------------------- :: wild -G |- _ ~< _ - - - -------------- :: id -G |- id ~< id - -G |- typ1 ~< typ'1 .. G |- typn ~< typ'n ---------------------------------------------------- :: tuple -G |- (typ1 , .. , typn ) ~< (typ'1, .. , typ'n) - - -defn -G |-l lit => typ :: :: infer_lit :: infer_lit_ -{{ com Infer that type of $[[lit]]$ is $[[typ]]$ }} -{{ tex [[G]] \vdash_l [[lit]] \Rightarrow [[typ]] }} -by - - ------------------------------ :: unit -G |-l () => unit - --------------------- :: zero -G |-l bitzero => bit - --------------------- :: one -G |-l bitone => bit - - ----------------------- :: num -G |-l num => atom < num > - - ----------------------- :: true -G |-l true => bool - - ----------------------- :: false -G |-l false => bool - -defn -G |- lexp := exp => typ -| D :: :: bind_assignment :: bind_assignment_ -{{ com Bind assignment returning updated environment }} -{{ tex [[G]] \vdash [[lexp]] := [[exp]] \Rightarrow [[typ]] \dashv [[D]] }} -by - - -G |- exp => typ -G |- id <= typ -| D -------------------------------- :: id -G |- id := exp => unit -| D - -defn -G |- pat <= typ -| D :: :: bind_pat :: bind_pat_ -{{ tex [[G]] \vdash [[pat]] \Leftarrow [[typ]] \dashv [[D]] }} -by - -G |- lit <= typ -------------------- :: lit -G |- lit <= typ -| G - -%% FIXME do add_local -G(id) = local mutable typ' ----------------------- :: local -G |- id <= typ -| G - -G(id) = unbound ----------------------- :: unbound -G |- id <= typ -| G - - -G(id) = enum typ' -G |- typ' ~< typ ----------------------- :: enum -G |- id <= typ -| G - - ----------------------- :: wild -G |- _ <= typ -| G - - -%% FIXME Should be fold? -G |- pat1 <= typ1 -| G1 .. G |- patn <= typn -| Gn -------------------------------------------------------- :: tup -G |- (pat1 , .. , patn ) <= (typ1 , .. , typn ) -| G , G1 .. Gn - - - -defn -G |- pat => typ -| D :: :: infer_pat :: infer_pat_ -{{ tex [[G]] \vdash [[pat]] \Leftarrow [[typ]] \dashv [[D]] }} -by - -G(id) = enum typ --------------------- :: id -G |- id => typ -| G - - -G |- pat <= typ -| D -------------------------------- :: typ -G |- (typ) pat => typ -| D - - -G |-l lit => typ ------------------------ :: lit -G |- lit => typ -| G - - -defn -G |-i id => typ :: :: infer_id :: infer_id_ -{{ com Infer type of indentifier }} -{{ tex [[G]] \vdash_i [[id]] \Rightarrow [[typ]] }} -by - - -G(id) = local mut typ ----------------------- :: local -G |-i id => typ - - -G(id) = enum typ ----------------------- :: enum -G |-i id => typ - - -G(id) = register typ ----------------------- :: register -G |-i id => typ - - -G(id) = union typquant typ -------------------------------------- :: union -G |-i id => typ - -defn -G |-f exp . id => typ :: :: infer_field :: infer_field_ -{{ tex [[G]] \vdash_f [[exp]] . [[id]] \Rightarrow [[typ]] }} -by - - -G |- exp => typ1 -G ( typ1 ) = register [ id2 ] -G ( id2 ) = (base,top,ranges) -ranges ( id ) = vec_typ ----------------------------- :: register -G |-f exp . id => vec_typ - - - -G |- exp => typ1 -G ( typ1 , id ) = typ ----------------------------- :: record -G |-f exp . id => typ - - -defn -G |- exp1 => n_constraint :: :: infer_flow :: infer_flow_ -by - - -G |- x => atom < nexp1 > -G |- y => atom < nexp2 > ----------------------------- :: lteq -G |- :E_app: lteq_atom_atom ( x , y ) => nexp1 <= nexp2 - - -G |- x => atom < nexp1 > -G |- y => atom < nexp2 > ----------------------------- :: gteq -G |- :E_app: gteq_atom_atom ( x , y ) => nexp1 >= nexp2 - -G |- x => atom < nexp1 > -G |- y => atom < nexp2 > ----------------------------- :: lt -G |- :E_app: lt_atom_atom ( x , y ) => nexp1 + numOne <= nexp2 - -G |- x => atom < nexp1 > -G |- y => atom < nexp2 > ----------------------------- :: gt -G |- :E_app: lteq_atom_atom ( x , y ) => nexp1 >= nexp2 + numOne - - -G |- id => range <nexp1 , nexp2 > -G |- y => atom < nexp > -------------------------------------------------------------------------------- :: lt_range_atom -G |- :E_app: lt_range_atom ( id , y ) => range < nexp1 , min (nexp - 1 , nexp2 ) > - - - - -defn - G |- exp => typ :: :: infer_exp :: infer_exp_ -{{ com Infer that type of $[[exp]]$ is $[[typ]]$ }} -{{ tex [[G]] \vdash [[exp]] \Rightarrow [[typ]] }} -by - - -G |- exp1 <= unit ... G |- expn <= unit ------------------------------------------- :: nondet -G |- nondet { exp1 ; ... ; expn } => unit - - -G |-i id => typ ----------------- :: id -G |- id => typ - - -G |-l lit => typ ----------------- :: lit -G |- lit => typ - - ------------------------------------ :: sizeof -G |- sizeof nexp => atom < nexp > - - --------------------------------------------- :: constraint -G |- constraint n_constraint => bool - -G |-f exp . id => typ ------------------------- :: field -G |- exp . id => typ - - -G |- exp1 => typ1 .... G |- expn => typn ----------------------------------------------------------- :: tuple -G |- ( exp1 , .... , expn ) => (typ1 , .... , typn ) - - - - -G |- lexp := exp => typ -| D --------------------- :: assign -G |- lexp := exp => typ - - - ----------------------------- :: record_update -G |- lexp . id := exp => typ - - -G |- exp <= typ ------------------------ :: cast -G |- ( typ ) exp => typ - - - -G |- :E_app: id ( exp1 , exp2 ) => typ --------------------------------- :: app_infix -G |- exp1 id exp2 => typ - - ---------------------------------------- :: app -G |- :E_app: id (exp1 , .. , expn ) => typ - - - -G |- exp1 => bool -G |- exp2 => unit -------------------------------- :: while_loop -G |- while exp1 do exp2 => unit - -G |- exp1 => unit -G |- exp2 => bool -------------------------------- :: until_loop -G |- repeat exp1 until exp2 => unit - -G |- exp1 => range <nexp1,nexp1'> -G |- exp2 => range <nexp2,nexp2'> -G |= nexp1' <= nexp2 -G |- exp3 <= int -G |- exp4 => unit ------------------------------------------------------------------------ :: for_inc -G |- foreach ( id from exp1 to exp2 by exp3 in inc ) exp4 => unit - -G |- exp1 => range <nexp1,nexp1'> -G |- exp2 => range <nexp2,nexp2'> -G |= nexp2' <= nexp1 -G |- exp3 <= int -G |- exp4 => unit ------------------------------------------------------------------------ :: for_dec -G |- foreach ( id from exp1 to exp2 by exp3 in dec ) exp4 => unit - - -G |- foreach ( id from exp1 to exp2 by exp3 in inc) exp4 => typ ------------------------------------------------------------------------ :: forup -G |- foreach ( id from exp1 to exp2 by exp3 ) exp4 => typ - - -G |- foreach ( id from exp1 to exp2 by numOne in inc) exp3 => typ ------------------------------------------------------------------------ :: forupbyone -G |- foreach ( id from exp1 to exp2 ) exp3 => typ - - -G |- foreach ( id from exp1 to exp2 by exp3 in dec) exp4 => typ ---------------------------------------------------------------------------- :: fordown -G |- foreach ( id from exp1 downto exp2 by exp3 ) exp4 => typ - -G |- foreach ( id from exp1 to exp2 by numOne in dec) exp3 => typ -------------------------------------------------------------------------- :: fordownbyone -G |- foreach ( id from exp1 downto exp2 ) exp3 => typ - - -G |- exp1 => n_constraint -%G , flows , constrs |- exp2 => typ -%G , flows , negate constrs |- exp3 <= typ --------------------------------------------- :: if -G |- if exp1 then exp2 else exp3 => typ - -G |- :E_app: vector_access ( exp , exp' ) => typ ------------------------------- :: vector_access -G |- exp [ exp' ] => typ - - -G |- :E_app: vector_subrange ( exp , exp1 , exp2 ) => typ ---------------------------- :: vector_subrange -G |- exp [ exp1 .. exp2 ] => typ - - -G |- :E_app: vector_update ( exp , exp1 , exp2 ) => typ ----------------------------------- :: vector_update -G |- :E_vector_update: [ exp with exp1 = exp2] => typ - - -G |- :E_app: vector_update_subrange ( exp , exp1 , exp2 , exp3 ) => typ ------------------------------------------- :: vector_update_subrange -G |- :E_vector_update_subrange: [ exp with exp1 : exp2 = exp3 ] => typ - - -G |- :E_app: vector_append ( exp1 , exp2 ) => typ ------------------------------------ :: vector_append -G |- exp1 : exp2 => typ - - -order_inc -G |- exp => typ -G |- exp1 <= typ .. G |- expn <= typ -nexp = length [|| exp , exp1 , .. , expn ||] --------------------------------------------- :: vector_inc -G |- [|| exp , exp1 , .. , expn ||] => typ [ numZero <: nexp ] - -order_dec -G |- exp => typ -G |- exp1 <= typ .. G |- expn <= typ -nexp = length [|| exp , exp1 , .. , expn ||] --------------------------------------------- :: vector_dec -G |- [|| exp , exp1 , .. , expn ||] => typ [ nexp :> numZero ] - - -G |- exp1 <= bool -G |- exp2 <= string ------------------------------------ :: assert -G |- assert (exp1, exp2 ) => unit - - -defn - G |- exp <= typ :: :: check_exp :: check_exp_ -{{ com Check that type of $[[exp]]$ is $[[typ]]$ }} -{{ tex [[G]] \vdash [[exp]] \Leftarrow [[typ]] }} -by - - -G |- exp1 <= unit ... G |- expn <= unit -G |- exp <= typ ------------------------------------ :: block -G |- { exp1; ... ; expn ; exp } <= typ - - - - - diff --git a/language/l2_terminals_non_tt.ott b/language/l2_terminals_non_tt.ott deleted file mode 100644 index 2c466b8b..00000000 --- a/language/l2_terminals_non_tt.ott +++ /dev/null @@ -1,31 +0,0 @@ -grammar -terminals :: '' ::= - | < :: :: lt - {{ tex \ensuremath{\langle} }} -% {{ tex \ottsym{<} }} - | > :: :: gt - {{ tex \ensuremath{\rangle} }} -% {{ tex \ottsym{>} }} - -% | [| :: :: range_start -% {{ tex \mbox{$\ottsym{[\textbar}$} }} -% | |] :: :: range_end -% {{ tex \mbox{$\ottsym{\textbar]}$} }} -% | [|| :: :: list_start -% {{ tex \mbox{$\ottsym{[\textbar\textbar}$} }} -% | ||] :: :: list_end -% {{ tex \mbox{$\ottsym{\textbar\textbar]}$} }} - - | -> :: :: arrow - {{ tex \ensuremath{\rightarrow} }} -% {{ tex \ottsym{-\textgreater} }} - {{ com \texttt{->} }} - - | >= :: :: geq - {{ tex \ensuremath{\geq} }} -% {{ tex \ottsym{\textgreater=} }} - {{ com \texttt{>=} }} - | '<=' :: :: leq - {{ tex \ensuremath{\leq} }} -% {{ tex \ottsym{\textless=} }} - {{ com \texttt{<=} }} diff --git a/language/l2_terminals_tt.ott b/language/l2_terminals_tt.ott deleted file mode 100644 index c6bc8d34..00000000 --- a/language/l2_terminals_tt.ott +++ /dev/null @@ -1,31 +0,0 @@ -grammar -terminals :: '' ::= - | < :: :: lt -% {{ tex \ensuremath{\langle} }} - {{ tex \ottsym{<} }} - | > :: :: gt -% {{ tex \ensuremath{\rangle} }} - {{ tex \ottsym{>} }} - - | [| :: :: range_start - {{ tex \mbox{$\ottsym{[\textbar}$} }} - | |] :: :: range_end - {{ tex \mbox{$\ottsym{\textbar]}$} }} - | [|| :: :: list_start - {{ tex \mbox{$\ottsym{[\textbar\textbar}$} }} - | ||] :: :: list_end - {{ tex \mbox{$\ottsym{\textbar\textbar]}$} }} - - | -> :: :: arrow -% {{ tex \ensuremath{\rightarrow} }} - {{ tex \ottsym{-\textgreater} }} - {{ com \texttt{->} }} - - | >= :: :: geq -% {{ tex \ensuremath{\geq} }} - {{ tex \ottsym{\textgreater=} }} - {{ com \texttt{>=} }} - | '<=' :: :: leq -% {{ tex \ensuremath{\leq} }} - {{ tex \ottsym{\textless=} }} - {{ com \texttt{<=} }} diff --git a/language/l2_typ.ott b/language/l2_typ.ott deleted file mode 100644 index 43077d60..00000000 --- a/language/l2_typ.ott +++ /dev/null @@ -1,382 +0,0 @@ - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -% Machinery for typing rules % -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% - -embed -{{ lem - -let rec remove_one i l = - match l with - | [] -> [] - | i2::l2 -> if i2 = i then l2 else i2::(remove_one i l2) -end - -let rec remove_from l l2 = - match l2 with - | [] -> l - | i::l2' -> remove_from (remove_one i l) l2' -end - -let disjoint s1 s2 = Set.null (s1 inter s2) - -let rec disjoint_all sets = - match sets with - | [] -> true - | s1::[] -> true - | s1::s2::sets -> (disjoint s1 s2) && (disjoint_all (s2::sets)) -end -}} - - -grammar - -k :: 'Ki_' ::= -{{ com Internal kinds }} - | K_Typ :: :: typ - | K_Nat :: :: nat - | K_Ord :: :: ord - | K_Efct :: :: efct - | K_Lam ( k0 .. kn -> k' ) :: :: ctor - | K_infer :: :: infer {{ com Representing an unknown kind, inferred by context }} - -t , u :: 'T_' ::= -{{ com Internal types }} - | x :: :: id - | ' x :: :: var - | t1 -> t2 effect :: :: fn - | ( t1 , .... , tn ) :: :: tup - | x < t_args > :: :: app - | t |-> t1 :: :: abbrev - | register < t_arg > :: S :: reg_app {{ ichlo T_app "register" [[t_arg]] }} - | range < ne ne' > :: S :: range_app {{ ichlo T_app "range" [[ [ ne ; ne' ] ]] }} - | atom < ne > :: S :: atom_app {{ ichlo T_app "atom" [ [[ne]] ] }} - | vector < ne ne' order t > :: S :: vector_app {{ ichlo T_app "vector" [[ [ ne; ne'; ord; t ] ]] }} - | list < t > :: S :: list_app {{ ichlo T_app "list" [[t]] }} - | reg < t > :: S :: box_app {{ ichlo T_app "reg" [[t]] }} - | implicit < ne > :: S :: implicit_app {{ ichlo T_app "implicit" [[ne]] }} - | bit :: S :: bit_typ {{ ichlo T_id "bit" }} - | string :: S :: string_typ {{ ichlo T_id "string" }} - | unit :: S :: unit_typ {{ ichlo T_id "unit" }} - | t [ t_arg1 / tid1 .. t_argn / tidn ] :: M :: subst {{ ichlo "todo" }} - -optx :: '' ::= {{ phantom }} {{ lem maybe string }} {{ ocaml string option }} - | x :: :: optx_x - {{ lem (Just [[x]]) }} {{ ocaml (Some [[x]]) }} - | :: :: optx_none - {{ lem Nothing }} {{ ocaml None }} - - -tag :: 'Tag_' ::= -{{ com Data indicating where the identifier arises and thus information necessary in compilation }} - | None :: :: empty - | Intro :: :: intro {{ com Denotes an assignment and lexp that introduces a binding }} - | Set :: :: set {{ com Denotes an expression that mutates a local variable }} - | Tuple :: :: tuple_assign {{ com Denotes an assignment with a tuple lexp }} - | Global :: :: global {{ com Globally let-bound or enumeration based value/variable }} - | Ctor :: :: ctor {{ com Data constructor from a type union }} - | Extern optx :: :: extern {{ com External function, specied only with a val statement }} - | Default :: :: default {{ com Type has come from default declaration, identifier may not be bound locally }} - | Spec :: :: spec - | Enum num :: :: enum - | Alias :: :: alias - | Unknown_path optx :: :: unknown {{ com Tag to distinguish an unknown path from a non-analysis non deterministic path}} - -ne :: 'Ne_' ::= - {{ com internal numeric expressions }} - | x :: :: id - | ' x :: :: var - | num :: :: const - | infinity :: :: inf - | ne1 * ne2 :: :: mult - | ne1 + ... + nen :: :: add - | ne1 - ne2 :: :: minus - | 2 ** ne :: :: exp - | ( - ne ) :: :: unary - | zero :: S :: zero - {{ lem (Ne_const 0) }} - | one :: S :: one - {{ lem (Ne_const 1) }} - | bitlength ( bin ) :: M :: cbin - {{ ocaml (asssert false) }} - {{ hol ARB }} - {{ lem (blength [[bin]]) }} - | bitlength ( hex ) :: M :: chex - {{ ocaml (assert false) }} - {{ hol ARB }} - {{ lem (hlength [[hex]]) }} - | count ( num0 ... numi ) :: M :: length {{ichlo "todo" }} - | length ( pat1 ... patn ) :: M :: cpat - {{ ocaml (assert false) }} - {{ hol ARB }} - {{ lem (Ne_const (List.length [[pat1...patn]])) }} - | length ( exp1 ... expn ) :: M :: cexp - {{ hol ARB }} - {{ ocaml (assert false) }} - {{ lem (Ne_const (List.length [[exp1...expn]])) }} - - t_arg :: 't_arg_' ::= - {{ com Argument to type constructors }} - | t :: :: typ - | ne :: :: nexp - | effect :: :: effect - | order :: :: order - | fresh :: M :: freshvar {{ lem T_arg (T_var "fresh") }} - - t_args :: '' ::= {{ lem list t_arg }} - {{ com Arguments to type constructors }} - | t_arg1 ... t_argn :: :: T_args - - nec :: 'Nec_' ::= - {{ com Numeric expression constraints }} - | ne <= ne' :: :: lteq - | ne = ne' :: :: eq - | ne >= ne' :: :: gteq - | ' x 'IN' { num1 , ... , numn } :: :: in - | nec0 .. necn -> nec'0 ... nec'm :: :: cond - | nec0 ... necn :: :: branch - -S_N {{ tex {\Sigma^{\textsc{N} } } }} :: '' ::= {{ phantom }} - {{ hol nec list }} - {{ lem list nec }} - {{ com nexp constraint lists }} - | { nec1 , .. , necn } :: :: Sn_concrete - {{ hol [[nec1 .. necn]] }} - {{ lem [[nec1 .. necn]] }} - | S_N1 u+ .. u+ S_Nn :: M :: SN_union - {{ hol (FOLDR FUNION FEMPTY [[S_N1..S_Nn]]) }} - {{ lem (List.foldr (++) [] [[S_N1..S_Nn]]) }} - {{ ocaml (assert false) }} - | consistent_increase ne1 ne'1 ... nen ne'n :: M :: SN_increasing - {{ com Generates constraints from pairs of constraints, where the first of each pair is always larger than the sum of the previous pair }} - {{ ocaml (assert false) }} - {{ ichl todo }} - | consistent_decrease ne1 ne'1 ... nen ne'n :: M :: SN_decreasing - {{ com Generates constraints from pairs of constraints, where the first of each pair is always smaller than the difference of the previous pair }} - {{ ocaml assert false }} - {{ ichl todo }} - | resolve ( S_N ) :: :: resolution - {{ lem [[S_N]] (* Write constraint solver *) }} - - - E_d {{ tex {\ottnt{E}^{\textsc{d} } } }} :: 'E_d_' ::= {{ phantom }} - {{ lem definition_env }} - {{ com Environments storing top level information, such as defined abbreviations, records, enumerations, and kinds }} - | < E_k , E_a , E_r , E_e > :: :: base - {{ hol arb }} - {{ lem (Denv [[E_k]] [[E_r]] [[E_e]]) }} - | empty :: :: empty - {{ hol arb }} - {{ lem DenvEmp }} - | E_d u+ E_d' :: :: union - {{ hol arb }} - {{ lem (denv_union [[E_d]] [[E_d']]) }} - - kinf :: 'kinf_' ::= - {{ com Whether a kind is default or from a local binding }} - | k :: :: k - | k default :: :: def - - tid :: 'tid_' ::= - {{ com A type identifier or type variable }} - | id :: :: id - | kid :: :: var - - E_k {{ tex {\ottnt{E}^{\textsc{k} } } }} :: 'E_k_' ::= {{ phantom }} - {{ hol (tid-> kinf) }} - {{ lem (map tid kinf) }} - {{ com Kind environments }} - | { tid1 |-> kinf1 , .. , tidn |-> kinfn } :: :: concrete - {{ hol (FOLDR (\(k1,k2) E. E |+ (k1,k2)) FEMPTY [[tid1 kinf1 .. tidn kinfn]]) }} - {{ lem (List.foldr (fun (x,v) m -> Map.insert x v m) Map.empty [[tid1 kinf1 .. tidn kinfn]]) }} - | E_k1 u+ .. u+ E_kn :: M :: union - {{ com In a unioning kinf, {k default} u {k} results in {k} (i.e. the default is locally forgotten) }} - {{ hol (FOLDR FUNION FEMPTY [[E_k1..E_kn]]) }} - {{ lem (List.foldr (union) Map.empty [[E_k1..E_kn]]) }} - {{ ocaml (assert false) }} - | E_k u- E_k1 .. E_kn :: M :: multi_set_minus - {{ hol arb }} - {{ lem (Map.fromList (remove_from (Set_extra.toList (Map.toSet [[E_k]])) - (Set_extra.toList (Map.toSet (List.foldr (union) Map.empty [[E_k1..E_kn]]))))) }} - {{ ocaml assert false }} - - tinf :: 'tinf_' ::= - {{ com Type variables, type, and constraints, bound to an identifier }} - | t :: :: typ - | E_k , S_N , tag , t :: :: quant_typ - -tinflist :: 'tinfs_' ::= - {{ com In place so that a list of tinfs can be referred to without the dot form }} - | empty :: :: empty - | tinf1 ... tinfn :: :: ls - -conformsto :: 'conformsto_' ::= - {{ com how much conformance does overloading need }} - | full :: :: full - | parm :: :: parm - -widenvec :: 'widenvec_' ::= - | vectors :: :: widen - | none :: :: dont - | _ :: :: dontcare - -widennum :: 'widennum_' ::= - | nums :: :: widen - | none :: :: dont - | _ :: :: dontcare - -widening :: 'widening_' ::= - {{ com Should we widen vector start locations, should we widen atoms and ranges }} - | ( widennum , widenvec ) :: :: w - - E_a {{ tex \ottnt{E}^{\textsc{a} } }} :: 'E_a_' ::= {{ phantom }} - {{ hol tid |-> tinf}} - {{ lem map tid tinf }} - | { tid1 |-> tinf1 , .. , tidn |-> tinfn } :: :: concrete - | E_a1 u+ .. u+ E_an :: :: union - - field_typs :: 'FT_' ::= {{ phantom }} - {{ lem list (id * t) }} - {{ com Record fields }} - | id1 : t1 , .. , idn : tn :: :: fields - {{ lem [[id1 t1..idn tn]] }} - - E_r {{ tex \ottnt{E}^{\textsc{r} } }} :: 'E_r_' ::= {{ phantom }} - {{ hol (id*t) |-> tinf) }} - {{ lem map (list (id*t)) tinf }} - {{ com Record environments }} - | { { field_typs1 } |-> tinf1 , .. , { field_typsn } |-> tinfn } :: :: concrete - {{ hol (FOLDR (\x E. E |+ x) FEMPTY) }} - {{ lem (List.foldr (fun (x,f) m -> Map.insert x f m) Map.empty [[field_typs1 tinf1..field_typsn tinfn]]) }} - | E_r1 u+ .. u+ E_rn :: M :: union - {{ hol (FOLDR FUNION FEMPTY [[E_r1..E_rn]]) }} - {{ lem (List.foldr (union) Map.empty [[E_r1..E_rn]]) }} - {{ ocaml (assert false) }} - - enumerate_map :: '' ::= {{ phantom }} - {{ lem (list (nat*id)) }} - | { num1 |-> id1 ... numn |-> idn } :: :: enum_map - {{ lem [[num1 id1...numn idn]] }} - - E_e {{ tex \ottnt{E}^{\textsc{e} } }} :: 'E_e_' ::= {{ phantom }} - {{ lem (map t (list (nat*id))) }} - {{ com Enumeration environments }} - | { t1 |-> enumerate_map1 , .. , tn |-> enumerate_mapn } :: :: base - {{ lem (List.foldr (fun (x,f) m -> Map.insert x f m) Map.empty [[t1 enumerate_map1..tn enumerate_mapn]]) }} - | E_e1 u+ .. u+ E_en :: :: union - {{ lem (List.foldr (union) Map.empty [[E_e1..E_en]]) }} - - -embed -{{ lem - type definition_env = - | DenvEmp - | Denv of (map tid kinf) * (map (list (id*t)) tinf) * (map t (list (nat*id))) - -}} - -grammar - - E_t {{ tex {\ottnt{E}^{\textsc{t} } } }} :: 'E_t_' ::= {{ phantom }} - {{ hol (id |-> tinf) }} - {{ lem map id tinf }} - {{ com Type environments }} - | { id1 |-> tinf1 , .. , idn |-> tinfn } :: :: base - {{ hol (FOLDR (\x E. E |+ x) FEMPTY [[id1 tinf1 .. idn tinfn]]) }} - {{ lem (List.foldr (fun (x,f) m -> Map.insert x f m) Map.empty [[id1 tinf1 .. idn tinfn]]) }} - | { id |-> overload tinf conformsto : tinf1 , ... , tinfn } :: :: overload - | ( E_t1 u+ .... u+ E_tn ) :: M :: union - {{ hol (FOLDR FUNION FEMPTY [[E_t1....E_tn]]) }} - {{ lem (List.foldr (union) Map.empty [[E_t1....E_tn]]) }} - {{ ocaml (assert false) }} - | u+ E_t1 .. E_tn :: M :: multi_union - {{ hol arb }} - {{ lem (List.foldr (union) Map.empty [[E_t1..E_tn]]) }} - {{ ocaml assert false }} - | E_t u- id1 .. idn :: M :: multi_set_minus - {{ hol arb }} - {{ lem (Map.fromList (remove_from (Set_extra.toList (Map.toSet [[E_t]])) - (Set_extra.toList (Map.toSet (List.foldr (union) Map.empty [[id1..idn]]))))) }} - {{ ocaml assert false }} - | ( E_t1 inter .... inter E_tn ) :: M :: intersect - {{ hol arb }} - {{ lem (List.foldr (fun a b -> (Map.fromList (Set_extra.toList ((Map.toSet a) inter (Map.toSet b))))) Map.empty [[E_t1....E_tn]]) }} - {{ ocaml (assert false) }} - | inter E_t1 .. E_tn :: M :: multi_inter - {{ hol arb }} - {{ lem (List.foldr (fun a b -> (Map.fromList (Set_extra.toList ((Map.toSet a) inter (Map.toSet b))))) Map.empty [[E_t1..E_tn]]) }} - {{ ocaml assert false }} - - -ts :: ts_ ::= {{ phantom }} - {{ lem list t }} - | t1 , .. , tn :: :: lst - -embed -{{ lem -let blength (bit) = Ne_const 8 -let hlength (bit) = Ne_const 8 - - type env = - | EnvEmp - | Env of (map id tinf) * definition_env - - type inf = - | Iemp - | Inf of (list nec) * effect - - val denv_union : definition_env -> definition_env -> definition_env - let denv_union de1 de2 = - match (de1,de2) with - | (DenvEmp,de2) -> de2 - | (de1,DenvEmp) -> de1 - | ((Denv ke1 re1 ee1),(Denv ke2 re2 ee2)) -> - Denv (ke1 union ke2) (re1 union re2) (ee1 union ee2) - end - - val env_union : env -> env -> env - let env_union e1 e2 = - match (e1,e2) with - | (EnvEmp,e2) -> e2 - | (e1,EnvEmp) -> e1 - | ((Env te1 de1),(Env te2 de2)) -> - Env (te1 union te2) (denv_union de1 de2) - end - -let inf_union i1 i2 = - match (i1,i2) with - | (Iemp,i2) -> i2 - | (i1,Iemp) -> i1 - | (Inf n1 e1,Inf n2 e2) -> (Inf (n1++n2) (effect_union e1 e2)) - end - -let fresh_kid denv = Var "x" (*TODO When strings can be manipulated, this should actually build a fresh string*) - -}} - -grammar - - E :: '' ::= - {{ hol ((string,env_body) fmaptree) }} - {{ lem env }} - {{ com Definition environment and lexical environment }} - | < E_t , E_d > :: :: E - {{ hol arb }} - {{ lem (Env [[E_t]] [[E_d]]) }} - | empty :: M :: E_empty - {{ hol arb }} - {{ lem EnvEmp }} - {{ ocaml assert false }} - | E u+ E' :: :: E_union - {{ lem (env_union [[E]] [[E']]) }} - - I :: '' ::= {{ lem inf }} - {{ com Information given by type checking an expression }} - | < S_N , effect > :: :: I - {{ lem (Inf [[S_N]] [[effect]]) }} - | Ie :: :: Iempty {{ com Empty constraints, effect }} {{ tex {\ottnt{I}_{\epsilon} } }} - {{ lem Iemp }} - | ( I1 u+ I2 ) :: :: singleunion {{ tex [[I1]] [[u+]] [[I2]] }} - | I1 u+ .. u+ In :: :: Iunion {{ com Unions the constraints and effect }} - {{ lem (List.foldr inf_union Iemp [[I1..In]]) }} - diff --git a/language/primitive_doc.ott b/language/primitive_doc.ott deleted file mode 100644 index a53f62fe..00000000 --- a/language/primitive_doc.ott +++ /dev/null @@ -1,130 +0,0 @@ -grammar - -built_in_types :: '' ::= - {{ com Type Kind }} - | bit : Typ :: :: bitDesc - | unit : Typ :: :: unitDesc - | forall Nat 'n. Nat 'm. range <'n, 'm> : Nat -> Nat -> Typ :: :: rangeDesc - | forall Nat 'n. atom <'n> : Nat -> Typ :: :: atomDesc {{ com singleton number, instead of range$< 'n,'n >$ }} - | forall Nat 'n, Nat 'm, Order 'o, Typ 't. vector < 'n, 'm, 'o, 't > : Nat -> Nat -> Order -> Typ :: :: vectorDesc - | forall Typ 'a. option < 'a > : Typ -> Typ :: :: optCtors - | forall Typ 't. register < 't > : Typ -> Typ :: :: registerDec - | forall Typ 't. reg < 't > : Typ -> Typ :: :: regDec - {{ com internal reference cell }} - | forall Nat 'n . implicit <'n> : Nat -> Typ :: :: implicitDesc - {{ com To add to a function val specification indicating that n relies on call site expected value }} - -built_in_type_abbreviations :: '' ::= - | bool => bit :: :: boolDesc - | nat => [| 0 '..' pos_infinity |] :: :: natDesc - | int => [| neg_infinity '..' pos_infinity |] :: :: intDesc - | uint8 => [| 0 '..' 2**8 |] :: :: uinteightDesc - | uint16 => [| 0 '..' 2**16 |] :: :: uintsixteenDesc - | uint32 => [| 0 '..' 2**32 |] :: :: uintthirtytwoDesc - | uint64 => [| 0 '..' 2**64 |] :: :: uintsixtyfourDesc - - -functions :: '' ::= - {{ com Built-in functions: all have effect pure, all order polymorphic }} - | val forall Typ 'a . 'a -> unit : ignore :: :: ignore - | val forall Typ 'a . 'a -> option < 'a > : Some :: :: some - | val forall Typ 'a . unit -> option < 'a > : None :: :: none - | val ( [: 'n :] , [: 'm :] ) -> [| 'n + 'm |] : + :: :: plusbase - {{ com arithmetic addition }} - | val forall Nat 'n . ( bit [ 'n ] , bit ['n] ) -> bit [ 'n ] : + :: :: plusvec - {{ com unsigned vector addition }} - | val forall Nat 'n . ( bit [ 'n ] , bit [ 'n ]) -> ( bit [ 'n ] , bit , bit ) : + :: :: plusoverflow - {{ com unsigned vector addition with overflow, carry out }} - | val forall Nat 'n . ( bit [ 'n ] , bit ['n] ) -> bit [ 'n ] : +_s :: :: plusvecS - {{ com signed vector addition }} - | val forall Nat 'n . (bit [ 'n ] , bit [ 'n ] ) -> ( bit [ 'n ] , bit , bit ) : +_s :: :: plusoverflowS - {{ com signed vector addition with overflow, carry out }} - | val ( [| 'n '..' 'm |] , [| 'o '..' 'p |] ) -> [| 'n - 'o '..' 'm - 'p |] : - :: :: minusbase - {{ com arithmetic subtraction }} - | val forall Nat 'n . ( bit [ 'n ] , bit ['n] ) -> bit [ 'n ] : - :: :: minusvec - {{ com unsigned vector subtraction }} - | val forall Nat 'n . ( bit [ 'n ] , bit [ 'n ] ) -> ( bit [ 'n ] , bit , bit ) : - :: :: minusoverflow - {{ com unsigned vector subtraction with overflow, carry out }} - | val forall Nat 'n . ( bit [ 'n ] , bit ['n] ) -> bit [ 'n ] : -_s :: :: minusvecS - {{ com signed vector subtraction }} - | val forall Nat 'n . (bit [ 'n ] , bit [ 'n ] ) -> ( bit [ 'n ] , bit , bit ) : -_s :: :: minusoverflowS - {{ com signed vector subtraction with overflow, carry out }} - | val ( [| 'n '..' 'm |] , [| 'o '..' 'p |] ) -> [| 'n * 'o '..' 'm * 'p |] : * :: :: multbase - {{ com arithmetic multiplication }} - | val forall Nat 'n . ( bit [ 'n ] , bit ['n] ) -> bit [ 2*'n ] : * :: :: multvec - {{ com unsigned vector multiplication }} - | val forall Nat 'n . ( bit [ 'n ] , bit ['n] ) -> bit [ 2*'n ] : *_s :: :: multvecS - {{ com signed vector multiplication }} - | val ( [| 'n '..' 'm |] , [| 1 '..' 'p |] ) -> [| 0 '..' 'p - 1 |] : mod :: :: modbase - {{ com arithmetic modulo }} - | val forall Nat 'n . ( bit [ 'n ] , bit [ 'n ] ) -> bit [ 'n ] : mod :: :: modvec - {{ com unsigned vector modulo }} - | val ( [| 'n '..' 'm |] , [| 1 '..' 'p |] ) -> [| 'q '..' 'r |] : quot :: :: quotbase - {{ com arithmetic integer division }} - | val forall Nat 'n , Nat 'm . ( bit [ 'n ] , bit [ 'm ] ) -> bit [ 'n ] : quot :: :: quotvec - {{ com unsigned vector division }} - | val forall Nat 'n , Nat 'm . ( bit [ 'n ] , bit [ 'm ] ) -> bit [ 'n ] : quot_s :: :: quotvecS - {{ com signed vector division }} - | val forall Typ 'a , Nat 'n . ( 'a [' n] -> [: 'n :] ) : length :: :: len - | val forall Typ 'a , Nat 'n , Nat 'm , 'n <= 'm . ( implicit < 'm > , 'a [ 'n ] ) -> 'a [ 'm ] : mask :: :: mask - {{ com reduce size of vector, dropping MSBits. Type system supplies implicit parameter, uses may require a cast }} - | val forall Nat 'n . ( bit [ 'n ] , bit [ 'n ] ) -> bit : == :: :: vecEQ - {{ com vector equality }} - | val forall Typ 'a , Typ 'b . ( 'a , 'b ) -> bit : == :: :: EQ - | val forall Typ 'a , Typ 'b . ( 'a , 'b ) -> bit : != :: :: NEQ - | val ( [| 'n '..' 'm |] , [| 'o '..' 'p |] ) -> bit : < :: :: ltbase - | val forall Nat 'n . ( bit [ 'n ] , bit ['n] ) -> bit : < :: :: ltvec - {{ com unsigned less than }} - | val forall Nat 'n . ( bit [ 'n ] , bit ['n] ) -> bit : <_s :: :: ltvecS - | val ( [| 'n '..' 'm |] , [| 'o '..' 'p |] ) -> bit : > :: :: gtbase - | val forall Nat 'n . ( bit [ 'n ] , bit ['n] ) -> bit : > :: :: gtvec - {{ com unsigned greater than }} - | val forall Nat 'n . ( bit [ 'n ] , bit ['n] ) -> bit : >_s :: :: gtvecS - | val ( [| 'n '..' 'm |] , [| 'o '..' 'p |] ) -> bit : <= :: :: lteqbase - | val forall Nat 'n . ( bit [ 'n ] , bit ['n] ) -> bit : <= :: :: lteqvec - {{ com unsigned less than or eq }} - | val forall Nat 'n . ( bit [ 'n ] , bit ['n] ) -> bit : <=_s :: :: lteqvecS - | val ( [| 'n '..' 'm |] , [| 'o '..' 'p |] ) -> bit : >= :: :: gteqbase - | val forall Nat 'n . ( bit [ 'n ] , bit ['n] ) -> bit : >= :: :: gteqvec - {{ com unsigned greater than or eq }} - | val forall Nat 'n . ( bit [ 'n ] , bit ['n] ) -> bit : >=_s :: :: gteqvecS - | val bit -> bit : ~ :: :: neg - {{ com bit negation }} - | val forall Nat 'n . bit [ 'n ] -> bit [ 'n ] : ~ :: :: negvec - {{ com bitwise negation }} - | val ( bit , bit ) -> bit : | :: :: or - {{ com bitwise or }} - | val forall Nat 'n . ( bit [ 'n ] , bit [ 'n ] ) -> bit [ 'n ] : | :: :: orvec - | val ( bit , bit ) -> bit : & :: :: and - {{ com bitwise and }} - | val forall Nat 'n . ( bit [ 'n ] , bit [ 'n ] ) -> bit [ 'n ] : & :: :: andvec - | val ( bit , bit ) -> bit : ^ :: :: xor - {{ com bitwise xor }} - | val forall Nat 'n . ( bit [ 'n ] , bit [ 'n ] ) -> bit [ 'n ] : '^' :: :: xorvec - | val forall Nat 'n . ( bit , [| 'n |] ) -> bit [ 'n ] : '^^' :: :: duplicate - {{ com duplicate bit into a vector }} - | val forall Nat 'n , Nat 'm , 'm <= 'n . ( bit [ 'n ] , [| 'm |] ) -> bit [ 'n ] : << :: :: lshift - {{ com left shift }} - | val forall Nat 'n , Nat 'm , 'm <= 'n . ( bit [ 'n ] , [| 'm |] ) -> bit [ 'n ] : >> :: :: rshift - {{ com right shift }} - | val forall Nat 'n , Nat 'm , 'm <= 'n . ( bit [ 'n ] , [| 'm |] ) -> bit [ 'n ] : <<< :: :: rotate - {{ com rotate }} - - -functions_with_coercions :: '' ::= - | val forall Nat 'n . (bit [ 'n ] , bit [ 'n ]) -> [| 2 ** 'n |] : + :: :: plusvecRange - | val forall Nat 'n, Nat 'o, Nat 'p. ( bit [ 'n ] , [| 'o '..' 'p |] ) -> bit [ 'n ] : + :: :: plusvecrange - | val forall Nat 'n, Nat 'o, Nat 'p. ( [| 'o '..' 'p |] , bit ['n] ) -> bit [ 'n ] : + :: :: plusrangevec - | val forall Nat 'n, Nat 'o, Nat 'p. ( bit [ 'n ] , [| 'o '..' 'p |] ) -> [| 'o '..' 'p + 2** 'n |] : + :: :: plusvecrangeRange - | val forall Nat 'n ( bit [ 'n ] , bit ) -> bit [ 'n ] : + :: :: plusvecbit - | val forall Nat 'n ( bit , bit [ 'n ] ) -> bit [ 'n ] : + :: :: plusbitvec - | val forall Nat 'n . (bit [ 'n ] , bit [ 'n ]) -> [| 2 ** 'n |] : +_s :: :: plusvecRangeS - | val forall Nat 'n, Nat 'o, Nat 'p. ( bit [ 'n ] , [| 'o '..' 'p |] ) -> bit [ 'n ] : +_s :: :: plusvecrangeS - | val forall Nat 'n, Nat 'o, Nat 'p. ( [| 'o '..' 'p |] , bit ['n] ) -> bit [ 'n ] : +_s :: :: plusrangevecS - | val forall Nat 'n, Nat 'o, Nat 'p. ( bit [ 'n ] , [| 'o '..' 'p |] ) -> [| 'o '..' 'p + 2** 'n |] : +_s :: :: plusvecrangeRangeS - | val forall Nat 'n ( bit [ 'n ] , bit ) -> bit [ 'n ] : +_s :: :: plusvecbitS - | val forall Nat 'n ( bit , bit [ 'n ] ) -> bit [ 'n ] : +_s :: :: plusbitvecS - | val forall Nat 'n, Nat 'o, Nat 'p. ( bit [ 'n ] , [| 'o '..' 'p |] ) -> bit [ 'n ] : - :: :: minusvecrange - | val forall Nat 'n, Nat 'o, Nat 'p. ( [| 'o '..' 'p |] , bit ['n] ) -> bit [ 'n ] : - :: :: minusrangevec - | val forall Nat 'n, Nat 'o, Nat 'p. ( bit [ 'n ] , [| 'o '..' 'p |] ) -> [| 'o '..' 'p + 2** 'n |] : - :: :: minusvecrangeRange - diff --git a/language/type_system.tex b/language/type_system.tex deleted file mode 100644 index afb9fb88..00000000 --- a/language/type_system.tex +++ /dev/null @@ -1,117 +0,0 @@ -\documentclass[11pt]{article} - -\usepackage{amsmath,amssymb,supertabular,geometry,fullpage} -\geometry{a4paper,twoside,landscape,left=10.5mm,right=10.5mm,top=20mm,bottom=30mm} -\usepackage{color} - -\begin{document} - -\input{doc_in} - -\title{Sail Type System} -\author{Kathryn E Gray, Gabriel Kerneis, Peter Sewell} - -\maketitle - -\tableofcontents - -\newpage - -\section{Sail syntax} - -\ottgrammartabular{ -\ottl\ottinterrule -\ottannot\ottinterrule -\ottid\ottinterrule -\ottkid\ottinterrule -\ottbaseXXkind\ottinterrule -\ottkind\ottinterrule -\ottnexp\ottinterrule -\ottorder\ottinterrule -\ottbaseXXeffect\ottinterrule -\otteffect\ottinterrule -\otttyp\ottinterrule -\otttypXXarg\ottinterrule -\ottnXXconstraint\ottinterrule -\ottkindedXXid\ottinterrule -\ottquantXXitem\ottinterrule -\otttypquant\ottinterrule -\otttypschm\ottinterrule -\ottnameXXscmXXopt\ottinterrule -\otttypeXXdef\ottinterrule -\otttypeXXunion\ottinterrule -\ottindexXXrange\ottinterrule -\ottlit\ottinterrule -\ottsemiXXopt\ottinterrule -\ottpat\ottinterrule -\ottfpat\ottinterrule -\ottexp\ottinterrule -\ottlexp\ottinterrule -\ottfexp\ottinterrule -\ottfexps\ottinterrule -\ottoptXXdefault\ottinterrule -\ottpexp\ottinterrule -\otttannotXXopt\ottinterrule -\ottrecXXopt\ottinterrule -\otteffectXXopt\ottinterrule -\ottfuncl\ottinterrule -\ottfundef\ottinterrule -\ottletbind\ottinterrule -\ottvalXXspec\ottinterrule -\ottdefaultXXspec\ottinterrule -\ottscatteredXXdef\ottinterrule -\ottregXXid\ottinterrule -\ottaliasXXspec\ottinterrule -\ottdecXXspec\ottinterrule -\ottdef\ottinterrule -\ottdefs\ottinterrule} - -\newpage -\section{Sail primitive types and functions} - -\ottgrammartabular{ -\ottbuiltXXinXXtypes\ottinterrule} - -\ottgrammartabular{ -\ottbuiltXXinXXtypeXXabbreviations\ottinterrule -\ottfunctions\ottinterrule -\ottfunctionsXXwithXXcoercions\ottinterrule} -\newpage - -\section{Sail type system} - -\subsection{Internal type syntax} - -\ottgrammartabular{ -\ottk\ottinterrule -\ottt\ottinterrule -\ottoptx\ottinterrule -\otttag\ottinterrule -\ottne\ottinterrule -\otttXXarg\ottinterrule -\otttXXargs\ottinterrule -\ottnec\ottinterrule -\ottSXXN\ottinterrule -\ottEXXd\ottinterrule -\ottkinf\ottinterrule -\otttid\ottinterrule -\ottEXXk\ottinterrule -\otttinf\ottinterrule -\ottEXXa\ottinterrule -\ottfieldXXtyps\ottinterrule -\ottEXXr\ottinterrule -\ottenumerateXXmap\ottinterrule -\ottEXXe\ottinterrule -\ottEXXt\ottinterrule -\ottts\ottinterrule -\ottE\ottinterrule -\ottI\ottinterrule -\ottformula\ottinterrule} - - -\subsection{ Type relations } -\ottdefnss - -\section{Sail operational semantics \{TODO\}} - -\end{document} |
