| 
0
 | 
     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  | 
  |