Anforderungen  |   Konzepte  |   Entwurf  |   Entwicklung  |   Qualitätssicherung  |   Lebenszyklus  |   Steuerung
 
 
 
 


Quelle  case_translation.ML   Sprache: SML

 
/
    inof
StefanNONE>= xsx
    Author:     Dmitriy Traytelthen x^1):   (,2 :tab

unprefix" ;
*)

signature | in ];
sig
  java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
   typ>

  datatype config =)java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 2
case_tr> -java.lang.StringIndexOutOfBoundsException: Index 57 out of bounds for length 57
  vallookup_by_constr
 vallookup_by_constr_permissive:Proof. ->string* typ> term*term) java.lang.StringIndexOutOfBoundsException: Range [93, 94) out of bounds for length 93
  val =ap_data(fn onstrscases >constrscases)java.lang.StringIndexOutOfBoundsException: Index 73 out of bounds for length 73
  
valrep_data=(
  val java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
  al comb
java.lang.StringIndexOutOfBoundsException: Range [3, 1) out of bounds for length 37
   term-   C- Context.java.lang.StringIndexOutOfBoundsException: Index 71 out of bounds for length 71
end;

structure Case_Translation: CASE_TRANSLATION =
struct

(** general utilities **)

funindexify_names names=    java.lang.StringIndexOutOfBoundsException: Index 4 out of bounds for length 4
  letlet
    val  (yco_= .lookup( =t
            =(  (,_= OME|  )
          NONE =>
            ifmember ( = java.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 6
            (asehint java.lang.StringIndexOutOfBoundsException: Index 17 out of bounds for length 17
            lse  >
|SOME=(^string_of_inti): xx 1: )java.lang.StringIndexOutOfBoundsException: Index 74 out of bounds for length 74
      ex[]_ONE=(java.lang.StringIndexOutOfBoundsException: Index 40 out of bounds for length 40
  in

fun(caseAListlookup(= tab
  et
    fun java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
idx,_)) =java.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 6
          
      
            name =.
          in if Symbol_Pos.is_identifierjava.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 0
  in indexify_names (mapjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0



(** data management **)

datatype        java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
          letval('used Name.variant sed
   : term* terml).table;

fun make_data (constrs, cases) = Data {constrsjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0

structure  = Generic_Data
(
  type T = datafoldconstrain_Abs tTs( t)java.lang.StringIndexOutOfBoundsException: Index 49 out of bounds for length 49
  val    (.,Symtab)java.lang.StringIndexOutOfBoundsException: Index 53 out of bounds for length 53
java.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 11
   canthe_constraint )(.consts)
     Data {constrsjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
java.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 13
      (java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
      
)  java.lang.StringIndexOutOfBoundsException: Range [29, 27) out of bounds for length 97

funabs_pat tT( usedjava.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42
  )=used
fun map_constrs f = map_data (              in (t' $ u', used'
fun map_cases

valrep_data=( Data |abs_pat__Ijava.lang.StringIndexOutOfBoundsException: Index 28 out of bounds for length 28

fun T_of_data funreplace_dummies( (<const_syntax\openPuredummy_pattern<close l'[]
  fastype_of               letSyntaxconst\^>opencase_elem<>$Term_Positionstrip_positionsl $r)
   end
  |> domain_type;

val Tname_of_data| dest_case1_ ( x ) used java.lang.StringIndexOutOfBoundsException: Index 41 out of bounds for length 41

val constrs_of = #constrs o rep_data;
val cases_of = caseso rep_data

fun lookup_by_constr ctxt (c, T) =
  let
    val tab=Symtab.lookup_list (java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
  java.lang.StringIndexOutOfBoundsException: Index 4 out of bounds for length 4
    (case body_type T of
      Type        yntax <^\open>ase_guard\ ,')= ';
    | _ =>          (fold_rev
  in(' ')nd

fun lookup_by_constr_permissive(dest_case2u
  let
    val            (  replace_dummiestused(,used;
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
    default=if   thenNONE else  ( (List tab)java.lang.StringIndexOutOfBoundsException: Index 72 out of bounds for length 72
    (*conservative wrt. overloaded constructors*)
  in
    (case hint of
      NONE =>val _=Theory.setupSignparse_translation[\^ (. \^const_syntax<case_elem\< T.strip_positions l' rjava.lang.StringIndexOutOfBoundsException: Index 112 out of bounds for length 112
             dest_case2( java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
        
          NONE => defaultjava.lang.StringIndexOutOfBoundsException: Range [10, 3) out of bounds for length 34
        |SOME info =>      let
  end;

val lookup_by_case = Symtab.lookup o cases_of;



(** installation **)

fun                const<const_syntax>opencase_guard<closee$t 

val name_of=try dest_Const_name;


(* parse translation *)

fun constrain_Abs tT t = Syntax.const \<^syntax_const>\<open>_constrainAbs\<close>             ( t=>fnu=>Syntax.const<const_syntax              inmk_clause t (s,T) : xs used'end

fun case_tr err ctxt [t, u] =
      let
               Syntaxconst\<syntax_const\<openase1close>java.lang.StringIndexOutOfBoundsException: Index 66 out of bounds for length 66
        fun                 map.xsrhs

        fun variant_free x
          let
   'elsex );

        fun abs p tTs t =
          .const\<^const_syntax>\opencase_abslet
            fold tTs (absfreept;

        fun abs_pat (Const (\<^syntax_const>\<open              letval Const <const_syntax\<opencase_cons\lose>,_ t $ uu)=
              abs_pat t (tT :mk_clause  ] Name. (. t)  mk_clauses java.lang.StringIndexOutOfBoundsException: Index 93 out of bounds for length 93
          | abs_pat (Free (p as (in
              if is_const x           | mk_clause (Const (<^const_syntax\opencase_elem<close>, _)   pat $ rhs) xs __ =
  abs_pat ( $u _= abs_pat u []# abs_pat t[]
          | abs_pat _ _ = I;

        (* replace occurrences of dummy_pattern by distinct variables *)
        fun replace_dummies (Const (\<^const_syntax>\<open>Pure.dummy_pattern\<close>,           foldr1(fn (t,u) = Syntax.const\<^syntax_const>\<pen_case2\close  t  u)
              letval(x,used)variant_free" used
              in (Free (x, T),      nd
          | replace_dummies (t $ u) used =
              let
                val (t' subst_bounds (map | case_tr' _ = raise Match;
                val (',used'java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
              in (t' $ u java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
            replace_dummies used=t,used

        fun dest_case1mk_clause t[ Namebuild_context (.declare_free_namest) :  
              let _ = raise Match;
                abs_patlist_comb(. \^yntax_const><>_\close>$x$
                  (Syntax. ;
              end
          | dest_case1 _ = case_error "dest_case1";

    valcase_key =dest_Const_name case_comb            mk_clauses t))
          |dest_case2t  ];

             constr_keys = mapdest_Const_nameconstrs
      
java.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 18
      (java.lang.StringIndexOutOfBoundsException: Index 19 out of bounds for length 19
in
            (dest_case2 u)
            |>  update_cases
      end
  | case_tr _ _ _ = case_error "case_tr";

val _ = Theory.setup (Sign.parse_translation [(\<^    alcase_key =dest_Const_namecase_comb


(* print translation *)

fun case_tr' (_ :: x :: t :: ts) =
      let
        fun    valdatafn(,ts >Thmdeclaration_attributeK(t ts))
                s,vTnameT data;
              invalupdate_constrs =  ( key= . (,(, ))) 
          m ((<const_syntax\open\close,_java.lang.StringIndexOutOfBoundsException: Range [76, 75) out of bounds for length 94
              Syntax.const \<^syntax_const>\<open
                subst_bounds (map Syntax_Trans.mark_bound_absjava.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
java.lang.StringIndexOutOfBoundsException: Index 2 out of bounds for length 0
          |mk_clause __  raiseMatch

|>map_cases update_cases
            ;
              mk_clause
           _= Theorysetup
      in
        list_comb         preserve namesgivenby *java.lang.StringIndexOutOfBoundsException: Index 39 out of bounds for length 39
          (fn(,u=>Syntaxconst<syntax_const\<_case2>  t$u)
            (mk_clauses t), ts)
      end
  | case_tr' _ = raise Match;

val     (Argsterm --Scanrepeat1Argsterm>


(* declarations *)

fun register raw_case_comb raw_constrs context =
  let
    valof  and;
    (
    val constrs = Variable.java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
    java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
    val constr_keys = map dest_Const_name constrs;
    val data = (case_comb, constrs);
    val Tname cjava.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 0
 update_constrs = fnkey =Symtabcons_list( (,data)constr_keys
   . tm    )java.lang.StringIndexOutOfBoundsException: Index 60 out of bounds for length 60
  inin  constructors
    context
    | update_constrs
    |>                 ' (n(v ) ) >row |>
  end;

val _ = Theory    apfst( [(,u] > v_to_prfx)( ~~rows
(.\binding<>case_translationclose
    (Args.term -- Scan.repeat1              (Const(, cT,i =java.lang.StringIndexOutOfBoundsException: Index 44 out of bounds for length 44
( t, >Thm (K (register t ts))))
    "declaration of case combinators and constructors";


(* (Un)check phases *)|SOMEcase_comb constructors

datatype configval = cT

exceptionjava.lang.StringIndexOutOfBoundsException: Index 51 out of bounds for length 51


(*Each pattern carries with it a tag i, which denotes the clause it
  came from. i = ~1 indicates that the clause was added by pattern
  completion.*)


fun add_row_used ((prfx, pats), (tm,si(flat,tree endjava.lang.StringIndexOutOfBoundsException: Index 50 out of bounds for length 49
  old (mapfn{,, .} =java.lang.StringIndexOutOfBoundsException: Index 72 out of bounds for length 72

(*try to preserve names given by user*)
fun default_name "" (Free (name', _)) =val mk _= CASE_ERROR ((Malformedrowmatrix,)
  | default_name name _ =                        map2 (fn {new_formals, , ...}=


(*Produce an instance of a constructor, plus fresh variables for its arguments.*)
fun fresh_constr coltyused c ==
  let
    val T = dest_Const_type c;
    val Ts = binder_types T;
    val  = Name.variantsused(Absif s = "thenname , T, t))
    val ty = body_type T;
    val ty_theta = Type.raw_match (ty, colty) Vartab.empty
      handle Type.                               ~~njava.lang.StringIndexOutOfBoundsException: Range [47, 25) out of bounds for length 25
    val c' = Envir.subst_term_types ty_theta c;
    val  = mapifmemberaxsthen
  inc, = case_functions[);

(*Go through a list of rows and pick out the ones beginning with a
  pattern with constructor = name.*)

in(x :java.lang.StringIndexOutOfBoundsException: Range [20, 19) out of bounds for length 21
  let val k =   _ )pat]java.lang.StringIndexOutOfBoundsException: Range [22, 21) out of bounds for length 21
prfx ::psrhs ,i))=
      fn ((in_group, not_in_group)inmk end
        java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
           name _java.lang.StringIndexOutOfBoundsException: Range [33, 30) out of bounds for length 37
            t_varsctxt pat  fold_aterms
              if length args         Termf    (, )java.lang.StringIndexOutOfBoundsException: Index 25 out of bounds for length 25
                ((((          ( s "occurs repeatedly java.lang.StringIndexOutOfBoundsException: Range [70, 71) out of bounds for length 70
                 map2 default_name
                  val  = map(no_repeat_vars             Syntaxstring_of_term  pat)java.lang.StringIndexOutOfBoundsException: Index 51 out of bounds for length 51
             (n_group row:not_in_group), names)
        | _ => raise CASE_ERROR ("
    rows ([], []), replicate[),replicate k ") valrangeT java.lang.StringIndexOutOfBoundsException: Range [17, 16) out of bounds for length 16
  ;


(* Partitioning *)

fun partition _ _ _ _ [] = raise CASE_ERROR ("partition: no rows", ~1)
  |Term(. \^>_\close,
      let
        fun part          Syntax.  ,rhs
 =  " acpattern" java.lang.StringIndexOutOfBoundsException: Index 90 out of bounds for length 90
          | part (c ::     rangeT =
              let
                val ((in_group, (case distinct (op =) (map (fastype_ofmsg, i =>
                val used' = fold add_row_used in_group used;
                val|_= case_errorallmusthave the same result type          case_error
                 in_group'
                  if null in_group  (* Constructor not given *)
                  then
                    let
v Tsfastype_of ps
                      valcase_error
                        Name. fold Termdeclare_free_namesgvarsused)
                          (replicate (length ps) "x");
                    
                      [((prfx, gvars              Thefollowing clausesareby clauses: 
open<,),1)java.lang.StringIndexOutOfBoundsException: Index 86 out of bounds for length 86
          if          
                  else in_group;
(* term check *)
                constructor  'java.lang.StringIndexOutOfBoundsException: Index 34 out of bounds for length 34
                 ew_formals ,
                 names = names,

              end
      in   end

 i t( s   xse
  | v_to_prfx _ = raise CASE_ERROR ("mk_case: v_to_prfx", ~1);


(* Translation of pattern terms into nested case expressions. *) decode_clause  Frees, T:xs used java.lang.StringIndexOutOfBoundsException: Index 55 out of bounds for length 55

fun mk_case ctxt used range_ty =
l
    val java.lang.StringIndexOutOfBoundsException: Index 12 out of bounds for length 0

    fun expand _ _ _ ((_, []), _) = raise CASE_ERROR ("mk_case: expand", ~1)
ps java.lang.StringIndexOutOfBoundsException: Range [67, 66) out of bounds for length 76
                    if ](ame(.declare_free_names   u
            let
              val used' =
              fun expnd c =
                let val capp java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
                 ( ::pssubst_free [p,) rhs, tag end
             ctxt if. u( java.lang.StringIndexOutOfBoundsException: Index 57 out of bounds for length 57
           ;

    val (nameletval(  ( )decode_case   u

    fun  |decode_case( asAbs)  t
  (_ ),):)(]  java.lang.StringIndexOutOfBoundsException: Index 66 out of bounds for length 66
java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
      |mku:java.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 6
          let val col0 = map (fn
            (case ( apfstname_of( ))f
              
                let
                  val rowsjava.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 0
java.lang.StringIndexOutOfBoundsException: Range [11, 8) out of bounds for length 27
                valstrip_abs_vars
            |  (Const            | SOME (Const
                (case v fs ysjava.lang.StringIndexOutOfBoundsException: Index 26 out of bounds for length 26
                   ap( java.lang.StringIndexOutOfBoundsException: Index 13 out of bounds for length 13
                | SOME (case_comb, 
                    letvalu=fold_revTermabs  strip_abs_body t)java.lang.StringIndexOutOfBoundsException: Index 60 out of bounds for length 60
                      val pty = body_type cT;
                       ' Tdeclare_free_names us;
                      val nrows = maps (expand constructors used' pty) val = fold_rev Term.abs ys strip_abs_body t);
 subproblems= partition usedconstructors ptyrange_ty
                      val (pat_rect, dtrees) =
                        split_list (map (fn {new_formals, group,letval  = length sjava.lang.StringIndexOutOfBoundsException: Range [15, 13) out of bounds for length 39
                          mk (new_formals @ us) group) subproblems);
                      valcase_functions 
                         ( ,body,falseAListmap_defaultop,(ons)
d_rev xas(),s=t>
                            Abs (if s = "" then name else s, T, abstract_over (x, t)))
                              ~names)
                        subproblems dtrees;
                         fastype_of case_functions@  [[];
                      val case_const = Const (name_of case_comb |> the        fun count_cases
                      val   list_comb(,  @ []java.lang.StringIndexOutOfBoundsException: Index 78 out of bounds for length 78
                    inflat pat_rect  end
            funmk_case(,java.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 17
                raiseCASE_ERROR(Notadatatype "^ Syntaxstring_of_term ctxt
          end
      |  __=( )=java.lang.StringIndexOutOfBoundsException: Index 35 out of bounds for length 35
  in ;


(*Repeated variable occurrences in a pattern are not allowed.*)
fun  = fold_aterms
  (fn x as Free (s, _) =>
      ( xs=java.lang.StringIndexOutOfBoundsException: Index 15 out of bounds for length 15
        f    x 
          case_error (quote s ^ " occurs repeatedly in the pattern " ^
string_of_termrm ctxt ))
        else x :: xs)
_= )pat [java.lang.StringIndexOutOfBoundsException: Range [19, 16) out of bounds for length 28

 make_case ctxtconfigusedxclauses=
  let
    fun string_of_clause (pat, rhs) =
      Syntax.unparse_term ctxt
syntax_const>\open_close,
          Syntax.uncheck_terms ctxt [pat, rhs])( count_casescases [);
      |> Pretty.string_of;

java.lang.StringIndexOutOfBoundsException: Range [7, 4) out of bounds for length 52
    val rows = map_index                     Namevariantjava.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 16
      =
      (case distinctop=)map( o       (case distinct (op =) (map (fastype_of o snd) clauses
        [] => case_error "no(casejava.lang.StringIndexOutOfBoundsException: Range [34, 33) out of bounds for length 74
java.lang.StringIndexOutOfBoundsException: Index 24 out of bounds for length 16
      | _ => case_error "all cases =java.lang.StringIndexOutOfBoundsException: Range [45, 39) out of bounds for length 74
    val' == add_row_usedrows ;
    val (tags, case_tm) =
       ctxt' [xcase cases
        handle |default ):                         cs: =
          case_error
            (msg ^ (if i                            else if                             iflength cs=   java.lang.StringIndexOutOfBoundsException: Index 72 out of bounds for length 72
    val _ =
      (case subtract (op =) tagsend
        [= )
      | is =>
          if config = Quiet then ()
          java.lang.StringIndexOutOfBoundsException: Index 14 out of bounds for length 14
 then case_errorelse warning (*FIXME lack of syntactic context!?*))
              ("java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
cat_lines     \\opencase_abscloseU -T ->T  .  end)
  in
    letval(.  [java.lang.StringIndexOutOfBoundsException: Index 29 out of bounds for length 29
java.lang.StringIndexOutOfBoundsException: Index 6 out of bounds for length 6


(* term check *)

fun (C(^><case_consclose  - )- S- ) > ->)$
l  s,java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
in  Free recurjava.lang.StringIndexOutOfBoundsException: Range [28, 27) out of bounds for length 38
  | decode_clause (Const (\<^const_name>\<open>case_elem\< <java.lang.StringIndexOutOfBoundsException: Range [27, 26) out of bounds for length 91
      (subst_bounds (xs, t)      in
  | decode_clause _ _ _        Const \<^const_name> encode_clauserecurT p $encode_casesrecurS T ps;

fun           <^term\<java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
  |decode_cases
       
  | decode_cases

fun check_case ctxt case  d Namebuild_context Termdeclare_free_names pat)rhs 
  let
      ( (<onst_name\>\close,)   $   =
          make_case ctxt (if\      Term( (p )exp)  java.lang.StringIndexOutOfBoundsException: Index 63 out of bounds for length 63
            Name.context      
      |java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
      | decode_case (  case dest_case   Namebuild_context (.declare_free_names          ubst_freeexp' patrhs)))
          let val (v, t') = Term.dest_abs_global
           ermabsfree v (ecode_case 'java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
        tSx )>SOMEx,mapsstrip_case ctxt )
  in
    java.lang.StringIndexOutOfBoundsException: Index 19 out of bounds for length 19
  endrip_case_full t=

  (casedest_case ctxt


(* Pretty printing of nested case expressions *) ('ctxt d) ( (fn pat', hsjava.lang.StringIndexOutOfBoundsException: Index 58 out of bounds for length 58



fun dest_case(dest_casectxtNamecontextt java.lang.StringIndexOutOfBoundsException: Index 42 out of bounds for length 42
  ( apfstname_of ( )java.lang.StringIndexOutOfBoundsException: Index 39 out of bounds for length 39
     d  =
      let
a (,let(). java.lang.StringIndexOutOfBoundsException: Index 51 out of bounds for length 51
        fun strip_abs i t =
          let
              = strip_abs_vars
            val j = length zs;
            java.lang.StringIndexOutOfBoundsException: Range [16, 15) out of bounds for length 26
              if   thenzs @
                map (pair "x")|  _ >
               t=
            valinTerm .getctxtshow_cases
            xs' mapFree(Name.variant_names(Term.declare_free_names u used) ;
            val (xs1, xs2) =  java.lang.StringIndexOutOfBoundsException: Index 18 out of bounds for length 18
xs1 u)x) java.lang.StringIndexOutOfBoundsException: Index 67 out of bounds for length 67
        funis_dependent
          let k=length( )-
          in>can   strip_case_full ctxt  java.lang.StringIndexOutOfBoundsException: Range [79, 0) out of bounds for length 0
 _,java.lang.StringIndexOutOfBoundsException: Range [35, 32) out of bounds for length 40
|count_cases(,(,body,java.lang.StringIndexOutOfBoundsException: Index 0 out of bounds for length 0
        funval=. java.lang.StringIndexOutOfBoundsException: Index 46 out of bounds for length 46
        fun mk_case (c,          java.lang.StringIndexOutOfBoundsException: Index 9 out of bounds for length 9
        val get_info = lookup_by_case ctxt;
      in
        (case get_info cname of
          OME(_ ) =>
            if length fs = length constructors then
              let
                val R = fastype_of x;
                val cases = map (fn (Const (s, U), t) =>
                  let
                    Us= binder_types U;
                    val k = length Us;
                    val p as (xs, _) = strip_abs k t;
                  java.lang.StringIndexOutOfBoundsException: Index 20 out of bounds for length 20
                    (           [Pretty       xname externtype_space name;
                  end) (constructors ~~ fs);
                val cases' =
                  sort (int_ord         markup =Name_Space name
                   java.lang.StringIndexOutOfBoundsException: Range [30, 29) out of bounds for length 52
                val dummy =
                  thenTermR
                  else Free (Name.variant "x"           . Pretty(,xname Prettystr"",
              java.lang.StringIndexOutOfBoundsException: Index 16 out of bounds for length 16
                SOME (x,
                  map              Prettycommas(  ));
                    (case find_first (is_undefined o fst) cases' of
                      SOME (_, cs) =>
                        if length cs = length constructors then [hd cases]
                        else filter_out java.lang.StringIndexOutOfBoundsException: Index 86 out of bounds for length 86
|NONE
                        (case  end
                          [] => cases
                        | (default,  Outer_Syntax.command \end;
                            if length cs = 1 then cases
                             iflengthcs lengthconstructorsthen
                              [hd cases, (dummy, ([], default),    Scan.ucceed(Toplevel. ( o Toplevel.))))
                            elseendjava.lang.StringIndexOutOfBoundsException: Index 4 out of bounds for length 4
                              filter_out (fn (c, _, _) => member op aconv cs c) cases @
                                [(dummy, ([], default), false)])))
              end
            else NONE
        | _ => NONE)
      end
  | _ => NONE);


(* destruct nested patterns *)

fun encode_clause recur S T (pat, rhs) =
  fold (fn x as (_, U) => fn t =>
    let val T = fastype_of t;
    in Const (\<^const_name>\<open>case_abs\<close>, (U --> T) --> T) $ Term.absfree x t end)
      (Term.add_frees pat [])
      (Const (\<^const_name>\<open>case_elem\<close>, S --> T --> S --> T) $ pat $ recur rhs);

fun encode_cases _ S T [] = Const (\<^const_name>\<open>case_nil\<close>, S --> T)
  | encode_cases recur S T (p :: ps) =
      Const (\<^const_name>\<open>case_cons\<close>, (S --> T) --> (S --> T) --> S --> T) $
        encode_clause recur S T p $ encode_cases recur S T ps;

fun encode_case recur (t, ps as (pat, rhs) :: _) =
      let
        val tT = fastype_of t;
        val T = fastype_of rhs;
      in
        Const (\<^const_name>\<open>case_guard\<close>, \<^typ>\<open>bool\<close> --> tT --> (tT --> T) --> T) $
          \<^term>\<open>True\<close> $ t $ (encode_cases recur (fastype_of pat) (fastype_of rhs) ps)
      end
  | encode_case _ _ = case_error "encode_case";

fun strip_case' ctxt d (pat, rhs) =
  (case dest_case ctxt d (Name.build_context (Term.declare_free_names pat)) rhs of
    SOME (exp as Free _, clauses) =>
      if Term.exists_subterm (curry (op aconv) exp) pat andalso
        not (exists (fn (_, rhs') =>
          Term.exists_subterm (curry (op aconv) exp) rhs') clauses)
      then
        maps (strip_case' ctxt d) (map (fn (pat', rhs') =>
          (subst_free [(exp, pat')] pat, rhs')) clauses)
      else [(pat, rhs)]
  | _ => [(pat, rhs)]);

fun strip_case ctxt d t =
  (case dest_case ctxt d Name.context t of
    SOME (x, clauses) => SOME (x, maps (strip_case' ctxt d) clauses)
  | NONE => NONE);

fun strip_case_full ctxt d t =
  (case dest_case ctxt d Name.context t of
    SOME (x, clauses) =>
      encode_case (strip_case_full ctxt d)
        (strip_case_full ctxt d x, maps (strip_case' ctxt d) clauses)
  | NONE =>
      (case t of
        t $ u => strip_case_full ctxt d t $ strip_case_full ctxt d u
      | Abs _ =>
          let val (v, t') = Term.dest_abs_global t;
          in Term.absfree v (strip_case_full ctxt d t') end
      | _ => t));


(* term uncheck *)

val show_cases = Attrib.setup_config_bool \<^binding>\<open>show_cases\<close> (K true);

fun uncheck_case ctxt ts =
  if Config.get ctxt show_cases
  then map (fn t => if can Term.type_of t then strip_case_full ctxt true t else t) ts
  else ts;

val _ = Context.>> (Syntax_Phases.term_uncheck 1 "case" uncheck_case);


(* outer syntax commands *)

fun print_case_translations ctxt =
  let
    val cases = map snd (Symtab.dest (cases_of ctxt));
    val type_space = Proof_Context.type_space ctxt;

    val pretty_term = Syntax.pretty_term ctxt;

    fun pretty_data (data as (comb, ctrs)) =
      let
        val name = Tname_of_data data;
        val xname = Name_Space.extern ctxt type_space name;
        val markup = Name_Space.markup type_space name;
        val prt =
          (Pretty.block o Pretty.fbreaks)
           [Pretty.block [Pretty.mark_str (markup, xname), Pretty.str ":"],
            Pretty.block [Pretty.str "combinator:", Pretty.brk 1, pretty_term comb],
            Pretty.block (Pretty.str "constructors:" :: Pretty.brk 1 ::
              Pretty.commas (map pretty_term ctrs))];
      in (xname, prt) end;
  in
    Pretty.big_list "case translations:" (map #2 (sort_by #1 (map pretty_data cases)))
    |> Pretty.writeln
  end;

val _ =
  Outer_Syntax.command \<^command_keyword>\<open>print_case_translations\<close>
    "print registered case combinators and constructors"
    (Scan.succeed (Toplevel.keep (print_case_translations o Toplevel.context_of)))

end;

Messung V0.5
C=97 H=100 G=98

¤ Dauer der Verarbeitung: 0.12 Sekunden  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.






                                                                                                                                                                                                                                                                                                                                                                                                     


Neuigkeiten

     Aktuelles
     Motto des Tages

Software

     Produkte
     Quellcodebibliothek

Aktivitäten

     Artikel über Sicherheit
     Anleitung zur Aktivierung von SSL

Muße

     Gedichte
     Musik
     Bilder

Jenseits des Üblichen ....
    

Besucherstatistik

Besucherstatistik

Monitoring

Montastic status badge