prove_goal.el
author nipkow
Thu, 11 Nov 1999 12:24:48 +0100
changeset 8012 bbdf3c51c3b8
parent 0 a5a9c433f639
permissions -rw-r--r--
Added MicroJava
     1 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
     2 ;; special function for Isabelle
     3 ;;
     4 ;;
     5 ; goalify.el
     6 ;
     7 ; Emacs command to change "goal" proofs to "prove_goal" proofs 
     8 ; and reverse IN A REGION.
     9 ;    [would be difficult in "sed" since replacements involve multiple lines]
    10 ;
    11 ;; origin is prove_goalify.el
    12 ;; enhanced by Franz Regensburger
    13 ;;    corrected some errors in regular expressions
    14 ;;    changed name prove_goalify --> goalify
    15 ;;    added inverse functions        ungoalify
    16 ;
    17 ; function goalify:
    18 ; 
    19 ; val PAT = goalARGS;$
    20 ; COMMANDS;$
    21 ; val ID = result();
    22 ; 
    23 ; to
    24 ; 
    25 ; val ID = prove_goalARGS
    26 ;  (fn PAT=>
    27 ;  [
    28 ;  COMMANDS
    29 ;  ]);
    30 ;;
    31 ;; Note: PAT must be an identifier. _ as pattern is not supported.
    32 ;;
    33 ; function ungoalify:
    34 ; 
    35 ; val ID = prove_goalARGS
    36 ;  (fn PAT=>
    37 ;  [
    38 ;  COMMANDS
    39 ;  ]);
    40 ;
    41 ;
    42 ; to 
    43 ; val PAT = goalARGS;$
    44 ; COMMANDS;$
    45 ; val ID = result();
    46 ; 
    47 
    48 
    49 (defun ungoalify (alpha omega)
    50  "Change well-formed prove_goal proofs to goal...result"
    51   (interactive "r"
    52 	       "*") 
    53   ; 0: restrict editing to region
    54   (narrow-to-region alpha omega)
    55 
    56   ; 1: insert delimiter ID 
    57   (goto-char (point-min))
    58   (replace-regexp  
    59   "[ \t]*val[ \t]+\\([^ \t\n=]+\\)[ \t\n=]+prove_goal" "\\1")
    60 
    61   ; 2: insertt delimiter ARGS  PAT  and  before first command   
    62   (goto-char (point-min))
    63   (replace-regexp  
    64   "[ \n\t]*(fn[ \t]+\\([^=]+\\)=>[^(]*" "\\1\n")
    65 
    66   ; 3: shift  over all commands
    67   ; Note: only one line per command
    68   (goto-char (point-max))
    69   (while (not (equal (point) (point-min)))
    70     (goto-char (point-min))
    71     (replace-regexp  
    72     "[ \t]*\\(.*\\),[ \t]*\n" "by \\1;\n"))
    73     
    74   ; 4: fix last 
    75   (goto-char (point-min))
    76   (replace-regexp  
    77     "[ \t]*\\(.*\\)[ \t\n]*\][ \t\n]*)[ \t\n]*;" "by \\1;")
    78 
    79   ; 5: arange new val Pat = goal .. 
    80   (goto-char (point-min))
    81   (replace-regexp  
    82   "\\([^]*\\)\\([^]*\\)\\([^]*\\)\n\\([^]*\\)"
    83   "val \\3= goal\\2;\n\\4\nval \\1 = result();")
    84 
    85   ; widen again
    86   (widen)
    87 )
    88 
    89 
    90 (defun goalify (alpha omega)
    91  "Change well-formed goal...result proofs to use prove_goal"
    92   (interactive "r"
    93                "*") 
    94 
    95   ; 0: restrict editing to region
    96   (narrow-to-region alpha omega)
    97 
    98   ; 1: delimit the identifier in "val ID = result()" using ^Q
    99   (goto-char (point-min))
   100   (replace-regexp  "val[ \t\n]+\\([^ \t\n=]+\\)[ \t\n=]+result();[ \t]*$"
   101    "\\1")
   102 
   103   ; 2: replace terminal \";  by  
   104   (goto-char (point-min))
   105   (replace-regexp  "\";[ \t]*$" "")
   106 
   107   ; 3: replace lines "by ...;" with "...,"
   108   (goto-char (point-min))
   109   (replace-regexp  "by[ \n\t]*\\([^;]*\\)[ \t\n]*;"  "\t\\1,")
   110 
   111   ; 4: removing the extra commas, those followed by ^Q
   112   (goto-char (point-min))
   113   (replace-regexp  ",[ \n\t]*"  "")
   114 
   115   ; 5: transforming goal... to prove_goal...
   116   (goto-char (point-min))
   117   (replace-regexp
   118   "val[ \t\n]+\\([^ \n\t=]+\\)[ \t\n=]+goal\\([^]*\\)
   119 \\([^]*\\)\\([^]*\\)"  
   120   "val \\4 = prove_goal\\2\"\n (fn \\1 =>\n\t[\n\\3\n\t]);")
   121 
   122   ; 6: widen again
   123   (widen)
   124 )
   125