|
|
Quellcode-Bibliothek
© Kompilation durch diese Firma
[Weder Korrektheit noch Funktionsfähigkeit der Software werden zugesichert.]
Datei:
patch-106.lisp
Sprache: Lisp
Original von: PVS©
|
|
;;
;; pvsio.lisp
;; Release: PVSio-6.0.9 (3/14/14)
;;
;; Contact: Cesar Munoz ([email protected])
;; NASA Langley Research Center
;; http://shemesh.larc.nasa.gov/people/cam/PVSio
;;
;; Copyright (c) 2011-2012 United States Government as represented by
;; the National Aeronautics and Space Administration. No copyright
;; is claimed in the United States under Title 17, U.S.Code. All Other
;; Rights Reserved.
;;
;; PVSio interface to the ground evaluator
;;
(in-package :pvs)
(defparameter *pvsio-promptin* " ")
(defparameter *pvsio-promptout* "==>~%")
(defun help-pvsio ()
(format
t
"~%Enter a PVS ground expression followed by ';' at the prompt '~a'" *pvsio-promptin*)
(format t "~% OR ")
(format
t
"~%Enter a Lisp expression followed by '!' at the prompt '~a'~%" *pvsio-promptin*)
(format t "~%The following special commands can be followed by either ';' or '!':
help : Print this message
quit : Exit the evaluator with confirmation
exit : Exit the evaluator without confirmation
timing : Turn on timing information per evaluation
notiming : Turn off timing information
tccs : Turn on TCCs generation per evaluation
notccs : Turn off TCCs generation
load_pvs_attachments : Force a reload .pvs-attachments and pvs-attachments
list_pvs_attachments : List semantic attachments loaded in the current
context
pvsio_version : Show current version of PVSio
To display help for <attachment>:
help_pvs_attachment(\"\");
To display help for semantic attachments in <theory>:
help_pvs_theory_attachments(\"\");
To change input prompt '~a':
set_promptin(\"\");
To change output prompt '~a':
set_promptout(\"\");
" *pvsio-promptin* *pvsio-promptout*))
(defun evaluation-mode-pvsio (theoryname &optional input tccs? (banner? t))
(let ((theory (get-typechecked-theory theoryname)))
(when theory
(with-open-file
(*error-output*
(merge-pathnames (format nil "~a.log" theoryname))
:direction :output
:if-does-not-exist :create
:if-exists (if *pvs-emacs-interface* :supersede :append))
(unwind-protect
(let ((*current-theory* theory)
(*generate-tccs* (if tccs? 'all 'none))
(*current-context* (or (saved-context theory) (context nil)))
(*suppress-msg* t)
(*in-evaluator* t)
(*destructive?* t)
(*eval-verbose* nil)
(*compile-verbose* nil)
(*convert-back-to-pvs* t)
(*disable-gc-printout* t)
(input-stream (when input (make-string-input-stream input))))
(if banner?
(format t "
+----
| ~a
|
| Enter a PVS ground expression followed by ';' at the prompt '~a'.
| Enter a Lisp expression followed by '!' at the prompt '~a'.
|
| Enter 'help' for help and 'exit' to exit the evaluator. Follow
| these commands with either ';' or '!'.
|
| *CAVEAT*: evaluation of expressions which depend on unproven TCCs may be
| unsound, and result in the evaluator crashing into Lisp, running out of
| stack, or worse. If you crash into Lisp, type (restore) to resume.
|
+----~%" *pvsio-version* *pvsio-promptin* *pvsio-promptin*)
(format t "Starting pvsio script~%"))
(evaluate-pvsio input-stream))
(when *pvs-emacs-interface*
(pvs-emacs-eval "(pvs-evaluator-ready)")))))))
(defun read-expr (input-stream)
(catch '*pvsio-command*
(do ((have-real-char nil)
(have-first-space nil)
(instr nil)
(fstr (make-string-output-stream))
(c (read-char input-stream nil nil)
(read-char input-stream nil nil)))
((and (eq c #\;)
(not instr))
(string-trim '(#\Space #\Tab #\Newline)
(get-output-stream-string fstr)))
(when (null c) (throw '*pvsio-quit* nil))
(when (and (not instr)
have-real-char
(not have-first-space)
(member c '(#\Space #\Newline #\Tab) :test #'char=))
(let ((pref (get-output-stream-string fstr)))
(cond ((member pref '("(lisp" "(pvs::lisp")
:test #+allegro #'string= #-allegro #'string-equal)
(let ((input (read input-stream nil nil)))
(format t "~%~s~2%~a" (eval input) *pvsio-promptin*))
(loop until (or (null c) (char= c #\)))
do (setq c (read-char-no-hang input-stream nil nil)))
(setq c #\Space)
(setq have-real-char nil
have-first-space nil))
(t (loop for ch across pref do (write-char ch fstr))
(setq havespace t)))))
(when (and (eq c #\!) (not instr))
(clear-input)
(throw '*pvsio-command*
(read-from-string
(get-output-stream-string fstr))))
(if have-real-char
(write-char c fstr)
(unless (member c '(#\Space #\Newline #\Tab) :test #'char=)
(write-char c fstr)
(setq have-real-char t)))
(when (eq c #\") (setq instr (not instr))))))
(defun evaluate-pvsio (input-stream)
(let ((result
(multiple-value-bind
(val err)
(ignore-errors ;; Change to progn for debugging
(catch '*pvsio-error*
(catch '*pvsio-quit*
(catch 'tcerror
(let* ((input (read-pvsio input-stream))
(pr-input (pc-parse input 'expr))
(*tccforms* nil)
(tc-input (pc-typecheck pr-input))
(isvoid (and tc-input
(type-name? (type tc-input))
(string= "void"
(format
nil "~a"
(print-type (type tc-input)))))))
(when *evaluator-debug*
(format t "~%Expression ~a typechecks to: ~%" pr-input)
(show tc-input))
(when *tccforms*
(format t "~%Typechecking ~a produced the following TCCs:~%" pr-input)
(evaluator-print-tccs *tccforms*)
(format
t
"~%~%Evaluating in the presence of unproven TCCs may be unsound~%")
(clear-input)
(unless (pvs-y-or-n-p "Do you wish to proceed with evaluation? ")
(throw '*pvsio-error* t)))
(let ((cl-input (pvs2cl tc-input)))
(when *evaluator-debug*
(format t "~%PVS expression ~a translates to Common Lisp expression:~%~a~%"
tc-input cl-input))
(multiple-value-bind
(cl-eval err)
(catch 'undefined
(ignore-errors
(if *pvs-eval-do-timing*
(time (eval cl-input))
(eval cl-input))))
(when *evaluator-debug*
(format t "~%Common Lisp expression ~a evaluates to:~%~a~%" cl-input cl-eval))
(cond ((and err (null cl-eval))
(format t "~%Error: ~a" err))
(err (format t "~%Error (~a): ~a" cl-eval err))
((eq cl-eval 'cant-translate)
(format t "~%Error: Expression doesn't appear to be ground"))
(*convert-back-to-pvs*
(unless isvoid
(let ((pvs-val
(catch 'cant-translate (cl2pvs cl-eval (type tc-input)))))
(if (expr? pvs-val)
(progn
(format t *pvsio-promptout*)
(force-output)
(unparse pvs-val))
(format t "~%Error: Result ~a is not ground" cl-eval)))))
(t (format t "~a" cl-eval)))))
t)))))
(if err (null input-stream) val))))
(when result
(format t "~%")
(evaluate-pvsio input-stream))))
(defun read-pvsio (input-stream)
(when (not input-stream)
(format t "~%~a" *pvsio-promptin*)
(force-output))
(let ((input (read-expr input-stream)))
(cond ((member input '(quit (quit) "quit") :test #'equal)
(clear-input)
(when (pvs-y-or-n-p "Do you really want to quit? ")
(throw '*pvsio-quit* nil))
(read-pvsio input-stream))
((member input '(exit (exit) "exit") :test #'equal)
(throw '*pvsio-quit* nil))
((member input '(help "help") :test #'equal)
(help-pvsio)
(read-pvsio input-stream))
((member input '(timing "timing") :test #'equal)
(setq *pvs-eval-do-timing* t)
(format t "Enabled printing of timing information~%")
(read-pvsio input-stream))
((member input '(notiming "notiming") :test #'equal)
(setq *pvs-eval-do-timing* nil)
(format t "Disabled printing of timing information~%")
(read-pvsio input-stream))
((member input '(tccs "tccs") :test #'equal)
(setq *generate-tccs* 'all)
(format t "Enabled TCCs generation~%")
(read-pvsio input-stream))
((member input '(notccs "notccs") :test #'equal)
(setq *generate-tccs* 'none)
(format t "Disabled TCCs generation~%")
(read-pvsio input-stream))
((member input '(pvsio-version pvsio_version "pvsio_version")
:test #'equal)
(format t "~a~%" *pvsio-version*)
(read-pvsio input-stream))
((member input '(list-pvs-attachments list_pvs_attachments
"list_pvs_attachments")
:test #'equal)
(list-pvs-attachments)
(read-pvsio input-stream))
((member input '(load-pvs-attachments load_pvs_attachments
"load_pvs_attachments")
:test #'equal)
(load-pvs-attachments t)
(read-pvsio input-stream))
((stringp input) input)
(t (multiple-value-bind
(val err)
(ignore-errors (eval input))
(if err (format t "ERROR (lisp): ~a" err)
(format t "~a" val))
(fresh-line)
(read-pvsio input-stream))))))
(defun run-pvsio ()
(let* ((file (environment-variable "PVSIOFILE"))
(time (read-from-string (environment-variable "PVSIOTIME")))
(theory (environment-variable "PVSIOTHEORY"))
(packlist (read-from-string (environment-variable "PVSIOPACK")))
(verb (read-from-string (environment-variable "PVSIOVERB")))
(tccs (read-from-string (environment-variable "PVSIOTCCS")))
(pvsio-main (environment-variable "PVSIOMAIN"))
(main (unless (string= pvsio-main "") (format nil "~a;" pvsio-main)))
(*pvsio-promptin* (environment-variable "PVSIOPROMPTIN"))
(*pvsio-promptout* (environment-variable "PVSIOPROMPTOUT"))
(*pvsio-version* (environment-variable "PVSIOVERSION")))
(when time (setq *pvs-eval-do-timing* t))
(multiple-value-bind
(val err)
(ignore-errors
(unless main
(format t "~%Generating ~a.log~%" theory))
(with-open-file
(*standard-output*
(merge-pathnames (directory-namestring file) (format nil "~a.log" theory))
:direction :output
:if-does-not-exist :create
:if-exists :supersede)
(change-context (directory-namestring file))
(dolist (pack packlist) (load-prelude-library pack))
(unwind-protect
(typecheck-file (file-namestring file) nil nil nil t)
(fresh-line)
(finish-output)))
(load-pvs-attachments)
(evaluation-mode-pvsio theory main tccs (null main))
t)
(when err (format t "~%~a (~a.pvs). See ~a~a.log~%"
err file (directory-namestring file) theory)))
(fresh-line)
(bye 0)))
¤ Dauer der Verarbeitung: 0.31 Sekunden
(vorverarbeitet)
¤
|
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 ist noch experimentell.
|
|
|
|
|