Verifying Type Soundness in HOL for Ocaml: the Core Language Scott Owens and Gilles Peskine

Verifying Type Soundness in HOL for Ocaml: the Core Language Scott Owens and Gilles Peskine

Verifying type soundness in HOL for OCaml: the core language Scott Owens and Gilles Peskine University of Cambridge Verifying type soundness in HOL for OCaml: the core language – p. 1/40 Full-scale Calculi and pragmatic additions Understand the pragmatics Ensure a working combination Program verification Verifying type soundness in HOL for OCaml: the core language – p. 2/40 The Goal Type soundness Accuracy Verifying type soundness in HOL for OCaml: the core language – p. 3/40 The Players Objective Caml HOL Ott Verifying type soundness in HOL for OCaml: the core language – p. 4/40 Outline OCaml specification Testing Experience Ott asides Verifying type soundness in HOL for OCaml: the core language – p. 5/40 OCaml ≈ Core ML/Caml light No modules No objects Operational semantics: LTS Type system: declarative Verifying type soundness in HOL for OCaml: the core language – p. 6/40 OCaml: Types typeconstr ::= typeconstr_name | int | exn | list | option | ref | . typexpr ::= α | _ | typexpr1 → typexpr2 | typexpr1 ∗ .... ∗ typexprn | typeconstr | typexpr typeconstr | ( typexpr1 , ... , typexprn ) typeconstr | . Verifying type soundness in HOL for OCaml: the core language – p. 7/40 Ott Aside Ott: | typexpr1 * .... * typexprn :: :: tuple Hol: | TE_tuple of typexpr list Verifying type soundness in HOL for OCaml: the core language – p. 8/40 OCaml: Data constr ::= constr_name | Match_failure | None | Some | . constant ::= int_literal | constr | true | false | [] | () | . unary_prim ::= raise | ref | not | ! | ∼− binary_prim ::= + |−|∗| / | := | = Verifying type soundness in HOL for OCaml: the core language – p. 9/40 OCaml: Patterns pattern ::= value_name | _ | pattern as value_name | pattern1::pattern2 | constant | pattern1 , .... , patternn | constr ( pattern1 , ... , patternn ) | constr _ | { field1 = pattern1 ; ... ; fieldn = patternn } | (pattern1 | pattern2) Verifying type soundness in HOL for OCaml: the core language – p. 10/40 Ott Aside | pattern as value_name :: :: alias (+ xs = xs(pattern) union value_name +) | pattern1 , .... , patternn :: :: tuple (+ xs = xs(pattern1....patternn) +) Verifying type soundness in HOL for OCaml: the core language – p. 11/40 OCaml: Expressions expr ::= ( %prim unary_prim ) | (%prim binary_prim ) | value_name | constant | ( expr : typexpr ) | expr1 , .... , exprn | constr ( expr1 , .. , exprn ) | expr1 :: expr2 | { field1 = expr1 ; ... ; fieldn = exprn } | { expr with field1 = expr1 ; ... ; fieldn = exprn } | expr . field | expr1 expr2 | . Verifying type soundness in HOL for OCaml: the core language – p. 12/40 OCaml: Expressions expr ::= while expr1 do expr2 done | for x = expr1 [down]to expr2 do expr3 done | let pattern = expr in expr | let rec letrec_bindings in expr | try expr with pattern_matching | location | . pattern_matching ::= pattern1 → expr1 | ... | patternn → exprn letrec_bindings ::= letrec_binding1 and ... and letrec_bindingn letrec_binding ::= value_name = function pattern_matching Verifying type soundness in HOL for OCaml: the core language – p. 13/40 Ott Aside | let rec letrec_bindings in expr :: :: letrec (+ bind xs(letrec_bindings) in letrec_bindings +) (+ bind xs(letrec_bindings) in expr +) Verifying type soundness in HOL for OCaml: the core language – p. 14/40 OCaml: Definitions definition ::= let let_binding | let rec letrec_bindings | type_definition | exception_definition type_definition ::= type typedef1 and .. and typedefn typedef ::= type_params typeconstr_name = type_information type_information ::= constr_decl1 | ... | constr_decln | { field_decl1 ; ... ; field_decln } Verifying type soundness in HOL for OCaml: the core language – p. 15/40 OCaml: Evaluation in Context L ′ ⊢ e1 −→ e1 L ′ ⊢ e1 v0 −→ e1 v0 JR_expr (Expr_apply expr1 expr2) a1 a2 = (∃ e1'. (a2 = Expr_apply e1' expr2) ∧ is_value_of_expr expr2 ∧ JR_expr expr1 a1 e1') ∨ ... Verifying type soundness in HOL for OCaml: the core language – p. 16/40 OCaml: Evaluation in Context L ′ ⊢ e1 −→ e1 L ′ ⊢ e1 v0 −→ e1 v0 Verifying type soundness in HOL for OCaml: the core language – p. 17/40 OCaml: Store ref v = l ⊢ ref v −→ l ! l = v ⊢ ! l −→ v Verifying type soundness in HOL for OCaml: the core language – p. 18/40 OCaml: Primitives let (+) = (-) in 2 + 1 let f x = x 4 in f ((+) 1) Verifying type soundness in HOL for OCaml: the core language – p. 19/40 OCaml: Primitives let (+) = (%uprim -) in 2 + 1 let f x = x 4 in f ((%uprim +) 1) Verifying type soundness in HOL for OCaml: the core language – p. 20/40 OCaml: Currying let f = function 1 -> function _ -> 0;; f 2;; let f = function 1 -> function _ -> 0 | _ -> function _ -> raise Match_failure;; f 2;; Verifying type soundness in HOL for OCaml: the core language – p. 21/40 OCaml: Binding type t = C of int;; let v = C 1;; type t = D of bool;; let _ = match v with D (b) -> (b && false);; Verifying type soundness in HOL for OCaml: the core language – p. 22/40 OCaml: Binding type t1 = C of int;; let v = C 1;; type t2 = C of bool;; let _ = v;; Verifying type soundness in HOL for OCaml: the core language – p. 23/40 OCaml: Binding let v1 = function x -> x;; let x = 1;; let v2 = v1 9;; Verifying type soundness in HOL for OCaml: the core language – p. 24/40 OCaml: Environments E ::= empty | E, EB EB ::= TV | value_name : typescheme | constr_name of typeconstr | constr_name of ∀ type_params, ( typexprs ) : typeconstr | field_name : ∀ type_params, typeconstr_name → typexpr | typeconstr_name : kind | typeconstr_name : kind { field_name1 ; ... ; field_namen } | location : typexpr Verifying type soundness in HOL for OCaml: the core language – p. 25/40 Ott Aside environment , E :: Env_ ::= {{ hol (environment_binding list) }} | empty :: :: nil {{ hol [] }} | E , EB :: :: cons {{ hol ([[EB]]::[[E]]) }} | EB1 , .. , EBn :: M :: list {{ hol (REVERSE [[EB1 .. EBn]]) }} | E1 @ .. @ En :: M :: tree {{ hol (FLAT (REVERSE [[E1 .. En]])) }} Verifying type soundness in HOL for OCaml: the core language – p. 26/40 OCaml: Polymorphism T shift 0 1 σ & E, TV ⊢ pat = nexp ⊲ x1 : t1 , .. , xn : tn T σ & E @ x1 : ∀ t1 , .. , xn : ∀ tn ⊢ e : t σT & E ⊢ let pat = nexp in e : t E ⊢ value_name ⊲ value_name : ts E ⊢ t ≤ ts E ⊢ value_name : t Verifying type soundness in HOL for OCaml: the core language – p. 27/40 Ott Aside | value_name : typexpr :: M :: vntype {{ com value binding with no universal quantifier }} {{ ich (EB_vn [[value_name]] (TS_forall (shiftt 0 1 [[typexpr]]))) }} Verifying type soundness in HOL for OCaml: the core language – p. 28/40 OCaml: Type Annotations Does it have a type? let f (x : 'a) : 'a = (x : 'a) && true;; Verifying type soundness in HOL for OCaml: the core language – p. 29/40 OCaml: Type Annotations let f (x : 'a) : 'a = (x : 'a) && true;; f : bool → bool Verifying type soundness in HOL for OCaml: the core language – p. 30/40 OCaml: Type Annotations let f (x : 'a) : 'a = (x : 'a) && true;; σT & E ⊢ e : t E ⊢ t ≤ σT src_t σT & E ⊢ ( e : src_t ) : t T ′ ′ σ & E, TV ⊢ pat = nexp ⊲ ( x1 : t1 ) , .. , ( xk : tk ) ′ ′ E ⊢ let pat = nexp : ( x1 : ∀ t1 ) , .. , ( xk : ∀ tk ) Verifying type soundness in HOL for OCaml: the core language – p. 31/40 Testing Our approach: Deterministic, small-step reduction function FP in a theorem prover Objective Caml’s parser Other approaches: Logic programming Big step Verifying type soundness in HOL for OCaml: the core language – p. 32/40 Testing L ′ ⊢ e1 −→ e1 L ′ ⊢ e1 v0 −→ e1 v0 JR_expr (Expr_apply expr1 expr2) a1 a2 = ( ∃ e1'. (a2 = Expr_apply e1' expr2) ∧ is_value_of_expr expr2 ∧ JR_expr expr1 a1 e1') ∨ ... red (Expr_apply expr1 expr2) = red_2 expr1 expr2 Expr_apply eval_apply Verifying type soundness in HOL for OCaml: the core language – p. 33/40 Statistics: Proof 6 man-months 9K HOL, 561 lemmas 3.7K Ott ≈ 50 pages typeset Grammar: 251 productions, 55 non-terminals (142, 63 source) Type system: 173 rules, 28 relations Op. Sem.: 137 rules, 15 relations, 12 helper functions Verifying type soundness in HOL for OCaml: the core language – p. 34/40 Statistics: Testing 540 lines HOL 145 tests Full coverage Verifying type soundness in HOL for OCaml: the core language – p. 35/40 Proof in HOL Operations on a goal: Rewriting and simplification Backward and forward chaining Witness ∃ Case split First-order proof search (Metis, 1191 times) Specification: Algebraic datatypes Inductive relations Well-founded recursion Verifying type soundness in HOL for OCaml: the core language – p. 36/40 Related Work Standard ML Lee, Crary, Harper (POPL 2007) van Inwegen (1996) Maharaj, Gunter (1994) Syme (1993) Java Java: Klein, Nipkow (TOPLAS 2006) Syme (1999) Nipkow, van Oheimb (POPL 1998) C Norrish (1998) Verifying type soundness in HOL for OCaml: the core language – p. 37/40 Conclusion Can work at full-scale Need good tools Binding is a minor concern Verifying type soundness in HOL for OCaml: the core language – p. 38/40 Type Soundness: Binding let x = (function _ -> let y = function w -> w in y) in let z = x in z (E @ E) ,α (E ,α @ E) ,α Verifying type soundness in HOL for OCaml: the core language – p. 39/40 Testing eval_uprim Uprim_ref v = StepAlloc (\e. e) v eval_bprim Bprim_assign v1 v2 = case v1 of Expr_location l -> StepAssign (Expr_constant CONST_unit) l v2 || _ -> Stuck Verifying type soundness in HOL for OCaml: the core language – p. 40/40.

View Full Text

Details

  • File Type
    pdf
  • Upload Time
    -
  • Content Languages
    English
  • Upload User
    Anonymous/Not logged-in
  • File Pages
    40 Page
  • File Size
    -

Download

Channel Download Status
Express Download Enable

Copyright

We respect the copyrights and intellectual property rights of all users. All uploaded documents are either original works of the uploader or authorized works of the rightful owners.

  • Not to be reproduced or distributed without explicit permission.
  • Not used for commercial purposes outside of approved use cases.
  • Not used to infringe on the rights of the original creators.
  • If you believe any content infringes your copyright, please contact us immediately.

Support

For help with questions, suggestions, or problems, please contact us