diff options
Diffstat (limited to 'phox/phox-pbrpm.el')
-rw-r--r-- | phox/phox-pbrpm.el | 279 |
1 files changed, 279 insertions, 0 deletions
diff --git a/phox/phox-pbrpm.el b/phox/phox-pbrpm.el new file mode 100644 index 00000000..de9ee603 --- /dev/null +++ b/phox/phox-pbrpm.el @@ -0,0 +1,279 @@ +;; $State$ $Date$ $Revision$ +;;--------------------------------------------------------------------------;; +;;--------------------------------------------------------------------------;; +;; the proof by rules popup menu part +;; +;; Note : program extraction is still experimental This file is very +;; dependant of the actual state of our developments +;;--------------------------------------------------------------------------;; + +;;--------------------------------------------------------------------------;; +;; Syntactic functions +;;--------------------------------------------------------------------------;; +(defun phox-pbrpm-regexps () + (setq + goal-backward-regexp "^goal [0-9]+/[0-9]+$" + goal-number-regexp "[0-9]+" + hyp-backward-regexp "[^A-Za-z0-9_.']\\([A-Za-z0-9_.']+\\) :=" + ccl-backward-regexp "|-") +) + +; TODO : deal with future invisible parentheses (french guillemots) +(defun phox-pbrpm-left-paren-p (char) +"Retrun t if the character is a left parenthesis : '(' or a french guillemot '<<'" + (or + (char-equal char (int-char 40)) + (char-equal char (int-char 171))) +) + +(defun phox-pbrpm-right-paren-p (char) +"Retrun t if the character is a right parenthesis ')' or a french guillemot '>>'" + (or + (char-equal char (int-char 41)) + (char-equal char (int-char 187))) +) + +;;--------------------------------------------------------------------------;; +;; Testing Menu +;;--------------------------------------------------------------------------;; + +(defun phox-pbrpm-generate-menu (click-infos region-infos) +; This FAKE function will be replace by a real 'generate-menu' once the code will be judged stable + +"Use informations to build a list of (name , rule)" + ;click-infos = (goal-number, "whole"/hyp-name/"none", expression, depth-tree-list) + ;region-infos = idem if in the goal buffer, (0, "none", expression, nil ) if in another buffer, do not display if no region available. + + (setq pbrpm-rules-list (list)) + + ; the first goal is the selected one by default, so we prefer not to display it. + + ; if clicking in a conclusion => select.intro + (if (and (string= (nth 1 click-infos) "none") (not region-infos)) + (setq pbrpm-rules-list + (append pbrpm-rules-list + (list + (list "Décompose" + (if (= (nth 0 click-infos) 1) + (identity "intro. ") + (concat "select " (int-to-string (nth 0 click-infos)) ". intro. "))) + (list "Décompose plusieurs" + (if (= (nth 0 click-infos) 1) + (identity "intros. ") + (concat "select " (int-to-string (nth 0 click-infos)) ". intros. "))) + );end list's + ); end append + );end setq + );end if + + ; if clicking in an hypothesis => select.elim + (if (and + (not (or (string= (nth 1 click-infos) "none") + (string= (nth 1 click-infos) "whole"))) + (not region-infos)) + (progn + (setq pbrpm-rules-list + (append pbrpm-rules-list + (list (list "Produit la conclusion" + (if (= (nth 0 click-infos) 1) + (concat "elim " + (nth 1 click-infos) + ". ") + (concat "select " + (int-to-string (nth 0 click-infos)) + ". elim " + (nth 1 click-infos) + ". ")))))) + (setq pbrpm-rules-list + (append pbrpm-rules-list + (list (list "QED" + (if (= (nth 0 click-infos) 1) + (concat "axiom " + (nth 1 click-infos) + ". ") + (concat "select " + (int-to-string (nth 0 click-infos)) + ". axiom " + (nth 1 click-infos) + ". ")))))))) + + ; if clicking in an hypothesis => select.left + (if (and + (not (or (string= (nth 1 click-infos) "none") + (string= (nth 1 click-infos) "whole"))) + (not region-infos)) + (setq pbrpm-rules-list + (append pbrpm-rules-list + (list (list "Décompose" + (if (= (nth 0 click-infos) 1) + (concat "left " + (nth 1 click-infos) + ". ") + (concat "select " + (int-to-string (nth 0 click-infos)) + ". left" + (nth 1 click-infos) + ". ") + )) + (list "Décompose plusieurs" + (if (= (nth 0 click-infos) 1) + (concat "lefts " + (nth 1 click-infos) + ". ") + (concat "select " + (int-to-string (nth 0 click-infos)) + ". lefts" + (nth 1 click-infos) + ". ") + )))))) + + + ; if region is an hypothesis (ie in the goals buffer) and clicking in that hyp's goal => + (if region-infos + (if (and + (not (or (string= (nth 1 region-infos) "none") + (string= (nth 1 region-infos) "whole"))) + (equal (nth 0 click-infos) (nth 0 region-infos)) + ) + (setq pbrpm-rules-list + (append pbrpm-rules-list + (list (list "Réécrit la conclusion" + (if (= (nth 0 click-infos) 1) + (concat "rewrite " + (nth 1 region-infos) + ". ") + (concat "select " + (int-to-string (nth 0 click-infos)) + ". rewrite " + (nth 1 region-infos) + ". "))))))) + ) + + (if (and + (not (or (string= (nth 1 click-infos) "none") + (string= (nth 1 click-infos) "whole"))) + (not (string= (nth 2 region-infos) "")) + ) + (setq pbrpm-rules-list + (append pbrpm-rules-list + (list (list "Applique l'hypothèse à une expression" + (if (= (nth 0 click-infos) 1) + (concat "apply " + (nth 1 click-infos) + " with " + (nth 2 region-infos) + ". ") + (concat "select " + (int-to-string (nth 0 click-infos)) + ". select " + (nth 1 click-infos) + " with " + (nth 2 region-infos) + ". "))))))) + + ; if region is an hypothesis (ie in the goals buffer) and clicking in an (other) hyp', both in the same goal => + (if region-infos + (if (and + (not (or (string= (nth 1 click-infos) "none") + (string= (nth 1 click-infos) "whole"))) + (not (or (string= (nth 1 region-infos) "none") + (string= (nth 1 region-infos) "whole"))) + (equal (nth 0 click-infos) (nth 0 region-infos)) + (not (string= (nth 1 click-infos) (nth 1 region-infos))) + ) + (progn + (setq pbrpm-rules-list + (append pbrpm-rules-list + (list (list "Réécrit l'hypothèse" + (if (= (nth 0 click-infos) 1) + (concat "rewrite_hyp " + (nth 1 click-infos) + " " + (nth 1 region-infos) + ". ") + (concat "select " + (int-to-string (nth 0 click-infos)) + ". rewrite_hyp " + (nth 1 click-infos) + " " + (nth 1 region-infos) + ". ")))))) + (setq pbrpm-rules-list + (append pbrpm-rules-list + (list (list "Applique l'hypothèse à une autre hypothèse" + (if (= (nth 0 click-infos) 1) + (concat "apply " + (nth 1 click-infos) + " with " + (nth 1 region-infos) + ". ") + (concat "select " + (int-to-string (nth 0 click-infos)) + ". select " + (nth 1 click-infos) + " with " + (nth 1 region-infos) + ". ")))))))) + + ) + + (identity pbrpm-rules-list) +) + + +;;--------------------------------------------------------------------------;; +;; Selections Buffer management -- unused for now +;;--------------------------------------------------------------------------;; +;initialize the selections buffer for the PBRPM mode +;1 buffer for every selections +(display-buffer (generate-new-buffer (generate-new-buffer-name "phox-selections"))) + +;copy the current region in the selections buffer +(defun pg-pbrpm-add-selection () +"Append the selection of the current buffer to +the phox-selections buffer used with PBRPM." + (interactive) + ;TODO : check wether the selected region is a well formed expression + ;copy at the end of the selections buffer before switching to it + ; else we'll loose mark & point + (switch-to-buffer (get-buffer "phox-selections")) + (goto-char (point-max)) + (insert-string (get-selection)) + ; if the selected region already ends with a \n, don't insert a second one + (if (not (bolp)) + (insert-string "\n")) + (insert-string "\n") + ;buffer is ready to receive a new selection +) + + +;clean the phox-selections buffer +(defun pg-pbrpm-clean-selections-buffer () +"Clean the phox-selections buffer used with PBRPM." + (interactive) + (erase-buffer (get-buffer "phox-selections")) +) + +;selections management menu +(defvar phox-pbrpm-menu +"Phox menu for dealing with Selections." + '("Selections" + ["Add Selection" pg-pbrpm-add-selection ] + ["Clean Selections buffer" pg-pbrpm-clean-selections-buffer ] + ) +) ;see phox.el > menu-entries + + +;;--------------------------------------------------------------------------;; +;; phox specific functions +;;--------------------------------------------------------------------------;; + +(defalias 'proof-pbrpm-generate-menu 'phox-pbrpm-generate-menu) +(defalias 'proof-pbrpm-left-paren-p 'phox-pbrpm-left-paren-p) +(defalias 'proof-pbrpm-right-paren-p 'phox-pbrpm-right-paren-p) +(defalias 'proof-pbrpm-regexps 'phox-pbrpm-regexps) + +;;--------------------------------------------------------------------------;; +(require 'pg-pbrpm) +(provide 'phox-pbrpm) +;; phox-pbrpm ends here
\ No newline at end of file |