| 17735 |      1 | # 
 | 
|  |      2 | # RELAX NG Schema for PGIP, the Proof General Interface Protocol                   
 | 
|  |      3 | # 
 | 
|  |      4 | # Authors:  David Aspinall, LFCS, University of Edinburgh       
 | 
| 23434 |      5 | #           Christoph Lüth, University of Bremen       
 | 
| 17735 |      6 | #
 | 
|  |      7 | # Status:   Prototype.
 | 
|  |      8 | #
 | 
|  |      9 | # For additional commentary, see accompanying commentary document available at
 | 
|  |     10 | # http://proofgeneral.inf.ed.ac.uk/Kit/docs/commentary.pdf
 | 
|  |     11 | #
 | 
|  |     12 | # Advertised version: 2.0
 | 
|  |     13 | # 
 | 
|  |     14 | # Contents
 | 
|  |     15 | # ========
 | 
|  |     16 | #
 | 
|  |     17 | #  0. Prelude
 | 
|  |     18 | #  1. Top-level 
 | 
|  |     19 | #  2. Component Control messages
 | 
|  |     20 | #  3. Display Commands
 | 
|  |     21 | #  4. Prover Configuration
 | 
|  |     22 | #  5. Interface Configuration
 | 
|  |     23 | #  6. Prover Control
 | 
|  |     24 | #  7. Proof script markup and proof control
 | 
|  |     25 | #
 | 
| 23434 |     26 | #
 | 
|  |     27 | # ===============================================================================
 | 
|  |     28 | #
 | 
|  |     29 | # Note on datatypes.  (see e.g. http://books.xmlschemata.org/relaxng):
 | 
|  |     30 | #
 | 
|  |     31 | #  token  : any string possibly with spaces, but spaces are normalised/collapsed
 | 
|  |     32 | #	    (i.e. tokenised).  Same as XML Schema xs:token
 | 
|  |     33 | #  string : any string, whitespaces preserved.  Same as XML Schema xs:string
 | 
|  |     34 | #	    (NB: attributes are normalised by XML 1.0 parsers so
 | 
|  |     35 | #	     spaces/newlines must be quoted)
 | 
|  |     36 | #  text	  : text nodes/mixed content (whitespace may be lost in mixed content)
 | 
|  |     37 | #
 | 
|  |     38 | # So: attributes should usually be tokens or more restrictive; (sometimes: strings for printing)
 | 
|  |     39 | #     element contents may be string (preserving whitespace), token (tokenising), 
 | 
|  |     40 | #       or text (which may contain further nodes).
 | 
| 17735 |     41 | 
 | 
|  |     42 | # ==============================================================================
 | 
|  |     43 | # 0. Prelude
 | 
|  |     44 | # ==============================================================================
 | 
|  |     45 | 
 | 
|  |     46 | include "pgml.rnc"                           # include PGML grammar
 | 
|  |     47 | 
 | 
| 23434 |     48 | name_attr = attribute name { token }         # names are user-level textual identifiers (space-collapsed)
 | 
|  |     49 | thyname_attr = attribute thyname { token }   # names for theories (special case of name)
 | 
|  |     50 | thmname_attr = attribute thmname { token }   # names for theorems (special case of name)
 | 
| 17735 |     51 | 
 | 
|  |     52 | datetime_attr = 
 | 
|  |     53 |    attribute datetime { xsd:dateTime }       # CCYY-MM-DDHH:MM:SS plus timezone info
 | 
|  |     54 | url_attr  = attribute url { xsd:anyURI }     # URLs  (often as "file:///localfilename.extn")
 | 
| 23434 |     55 | dir_attr  = attribute dir { string }         # Unix-style directory name (no final slash)
 | 
| 17735 |     56 | 
 | 
|  |     57 | systemdata_attr  = 
 | 
| 23434 |     58 |             attribute systemdata { token }?   # system-specific data (useful for "stateless" RPC)
 | 
| 17735 |     59 | 
 | 
| 23434 |     60 | objname = token	     # an identifier name (convention: any characters except semi-colon)
 | 
|  |     61 | objnames = token     # sequence of names in an attribute: semi-colon separated
 | 
| 17735 |     62 | 
 | 
| 23434 |     63 | #objnames = string                            # A sequence of objnames
 | 
|  |     64 | #termobjname  = string { pattern = "[^;]+;" }  # unfortunately these declarations don't 
 | 
|  |     65 | #objnames = objname | (termobjname, objname)
 | 
| 17735 |     66 | #objnames = objname+                               #  work with the RNC->DTD tool trang
 | 
|  |     67 | 
 | 
|  |     68 | 
 | 
|  |     69 | # ==============================================================================
 | 
|  |     70 | # 1. Top-level Messages/documents
 | 
|  |     71 | # ==============================================================================
 | 
|  |     72 | 
 | 
|  |     73 | start = pgip                                 # Single message
 | 
|  |     74 |       | pgips                                # A log of messages between components
 | 
|  |     75 |       | displayconfig                        # displayconfig as a standalone element
 | 
|  |     76 |       | pgipconfig                           # pgipconfig as a standalone element
 | 
| 23434 |     77 |       | pgipdoc                              # A proof script document 
 | 
| 17735 |     78 | 
 | 
|  |     79 | pgip = element pgip {                        #  A PGIP packet contains:
 | 
|  |     80 |    pgip_attrs,                               #   - attributes with header information;
 | 
|  |     81 |    (toprovermsg | todisplaymsg |             #   - a message with one of four channel types
 | 
|  |     82 |     fromprovermsg | fromdisplaymsg 
 | 
|  |     83 |    | internalmsg ) 
 | 
|  |     84 |   }
 | 
|  |     85 | 
 | 
|  |     86 | pgips = element pgips { pgip+ }
 | 
|  |     87 | 
 | 
|  |     88 | pgip_attrs =
 | 
| 23434 |     89 |  attribute tag { token }?,                  # message tag, e.g. name of origin component (diagnostic)
 | 
|  |     90 |  attribute id { token },                    # (unique) session id of this component 
 | 
|  |     91 |  attribute destid { token }?,               # session id of destination component
 | 
| 17735 |     92 |  attribute class { pgip_class },            # general categorization of message
 | 
| 23434 |     93 |  attribute refid { token }?,                # component id this message responds to (usually destid)
 | 
| 17735 |     94 |  attribute refseq { xsd:positiveInteger }?, # message sequence this message responds to
 | 
|  |     95 |  attribute seq { xsd:positiveInteger }      # sequence number of this message
 | 
|  |     96 | 
 | 
| 23434 |     97 | pgip_class = "pg"      # message sent TO proof general broker (e.g. FROM proof assistant).
 | 
| 17735 |     98 |            | "pa"      # message sent TO the proof assistant/other component
 | 
|  |     99 |            | "pd"      # message sent TO display/front-end components
 | 
|  |    100 | 
 | 
|  |    101 | toprovermsg =          # Messages sent to the prover (class "pa"):
 | 
|  |    102 |    proverconfig        #   query Prover configuration, triggering interface configuration
 | 
|  |    103 |  | provercontrol       #   control some aspect of Prover
 | 
|  |    104 |  | improperproofcmd    #   issue a proof command 
 | 
|  |    105 |  | improperfilecmd     #   issue a file command
 | 
|  |    106 |  | properproofcmd      #   [ NB: not strictly needed: input PGIP processing not expected ]
 | 
|  |    107 |  | properfilecmd       #   [ NB: not strictly needed: input PGIP processing not expected ]
 | 
|  |    108 |  | proofctxt           #   issue a context command
 | 
|  |    109 | 
 | 
|  |    110 | fromprovermsg =        # Messages from the prover to PG (class "pg"):
 | 
|  |    111 |    kitconfig           #   messages to configure the interface 
 | 
|  |    112 |  | proveroutput        #   output messages from the prover, usually display in interface
 | 
|  |    113 |  | fileinfomsg         #   information messages concerning file-system access / prover state
 | 
|  |    114 | 
 | 
|  |    115 | todisplaymsg =         # Messages sent to display components (class "pd"):
 | 
|  |    116 |    brokermsg           #   status reports from broker
 | 
|  |    117 |  | dispmsg             #   display commands
 | 
|  |    118 |                        #   - Further, all fromprovermsg can be relayed to display
 | 
|  |    119 | 
 | 
|  |    120 | fromdisplaymsg =       # Messages sent from display components (class "pg"):
 | 
|  |    121 |    dispcmd             #   display messages 
 | 
|  |    122 |  | brokercontrol       #   messages controlling broker & prover processes
 | 
|  |    123 | 		       #   - Further, all toprovermsg to be relayed to prover
 | 
|  |    124 | 
 | 
|  |    125 | # ===========================================================================
 | 
|  |    126 | # 2. Component Control
 | 
|  |    127 | # ===========================================================================
 | 
|  |    128 | 
 | 
|  |    129 | #
 | 
|  |    130 | # Idea:  - broker knows how to manage some components (inc provers) as child processes,
 | 
|  |    131 | #          communicate via pipes.  Configured by a fixed PGIP config file read on startup.
 | 
|  |    132 | #        - other components may connect to running broker
 | 
|  |    133 | #
 | 
|  |    134 | # TODO: - describe startup protocol for component connecting to to running broker dynamically.
 | 
|  |    135 | 
 | 
|  |    136 | # This is the element contained in the configuration file read by the 
 | 
|  |    137 | # broker on startup.
 | 
|  |    138 | pgipconfig = element pgipconfig { componentspec* }
 | 
|  |    139 | 
 | 
|  |    140 | componentspec = 
 | 
|  |    141 |    element componentspec {
 | 
|  |    142 |       componentid_attr,         # Unique identifier for component class
 | 
|  |    143 |       componentname_attr,       # Textual name of component class
 | 
|  |    144 |       componenttype,            # Type of component: prover, display, auxiliary
 | 
| 23434 |    145 |       startupattrs,		# Describing startup behaviour
 | 
|  |    146 |       systemattrs,              # System attributes for component
 | 
| 17735 |    147 |       componentconnect          # How to connect to component
 | 
|  |    148 |    }
 | 
|  |    149 | 
 | 
|  |    150 | componentid_attr   = attribute componentid   { token }
 | 
| 23434 |    151 | componentname_attr = attribute componentname { token }
 | 
| 17735 |    152 | 
 | 
|  |    153 | componenttype = element componenttype {
 | 
|  |    154 |      provercomponent 
 | 
|  |    155 |    | displaycomponent 
 | 
|  |    156 |  # | filehandlercomponent 
 | 
|  |    157 |    | parsercomponent 
 | 
|  |    158 |    | othercomponent }
 | 
|  |    159 | 
 | 
|  |    160 | provercomponent  = element provercomponent { empty }
 | 
|  |    161 | displaycomponent = element displaycomponent { attribute active { xsd:boolean}? }
 | 
|  |    162 | parsercomponent  = element parsercomponent  { componentid_attr }
 | 
|  |    163 | othercomponent   = element othercomponent { empty }
 | 
|  |    164 | 
 | 
|  |    165 | componentconnect =
 | 
|  |    166 |    componentsubprocess | componentsocket | connectbyproxy
 | 
|  |    167 | 
 | 
|  |    168 | componentsubprocess = 
 | 
| 23434 |    169 |    element syscommand { string }
 | 
| 17735 |    170 | componentsocket = 
 | 
| 23434 |    171 |    (element host { token }, element port { xsd:positiveInteger })
 | 
| 17735 |    172 | connectbyproxy = 
 | 
| 23434 |    173 |    (element proxy { attribute host { token }    # Host to connect to
 | 
| 17735 |    174 | 		  , attribute connect { 
 | 
|  |    175 |                            "rsh" | "ssh" # Launch proxy via RSH or SSH, needs
 | 
|  |    176 | 			                 # authentication 
 | 
|  |    177 |                          | "server"  # connect to running proxy on given port
 | 
|  |    178 |                          }?
 | 
| 23434 |    179 |                   , attribute user { token } ? # user to connect as with RSH/SSH
 | 
|  |    180 |                   , attribute path { token } ? # path of pgipkit on remote
 | 
|  |    181 | 		  , attribute port { xsd:positiveInteger } ? # port to connect to running proxy
 | 
| 17735 |    182 | 		  , componentconnect
 | 
|  |    183 | 		  })
 | 
|  |    184 | 
 | 
| 23434 |    185 | # Attributes describing when to start the component.
 | 
|  |    186 | startupattrs =
 | 
|  |    187 |   attribute startup {		# what to do on broker startup:
 | 
| 17735 |    188 |              "boot"   |		# always start this component (default with displays)
 | 
|  |    189 |              "manual" |		# start manually (default with provers)
 | 
| 23434 |    190 |              "ignore"		# never start this component
 | 
| 17735 |    191 |              }?
 | 
| 23434 |    192 | 
 | 
|  |    193 | # System attributes describing behaviour of component. 
 | 
|  |    194 | systemattrs = (
 | 
|  |    195 |     attribute timeout { xsd:integer }?  # timeout for communications
 | 
|  |    196 |   , attribute sync { xsd:boolean }?     # whether to wait for ready
 | 
|  |    197 |   , attribute nestedgoals { xsd:boolean}? # Does prover allow nested goals?
 | 
|  |    198 |   )
 | 
| 17735 |    199 | 
 | 
|  |    200 | # Control commands from display to broker
 | 
|  |    201 | brokercontrol = 
 | 
|  |    202 |     launchprover		# Launch a new prover
 | 
|  |    203 |   | exitprover			# Request to terminate a running prover
 | 
|  |    204 |   | restartprover		# Request to restart/reset a running prover
 | 
|  |    205 |   | proversquery		# Query about known provers, running provers
 | 
|  |    206 |   | shutdownbroker		# Ask broker to exit (should be wary of this!)
 | 
|  |    207 |   | brokerstatusquery		# Ask broker for status report
 | 
|  |    208 |   | pgipconfig			# Send config to broker
 | 
|  |    209 | 
 | 
|  |    210 | provername_attr    = attribute provername { provername }
 | 
|  |    211 | provername         = token
 | 
|  |    212 | 
 | 
|  |    213 | proverid_attr     = attribute proverid  { proverid }
 | 
|  |    214 | proverid          = token
 | 
|  |    215 | 
 | 
|  |    216 | launchprover      = element launchprover { componentid_attr }
 | 
|  |    217 | exitprover        = element exitprover { proverid_attr }
 | 
|  |    218 | restartprover     = element restartprover { proverid_attr }
 | 
|  |    219 | proversquery      = element proversavailable { empty }
 | 
|  |    220 | brokerstatusquery = element brokerstatusquery { empty } 
 | 
|  |    221 | shutdownbroker    = element shutdownbroker { attribute force { xsd:boolean }? } 
 | 
|  |    222 | 
 | 
|  |    223 | # Control messages from broker to interface
 | 
|  |    224 | brokermsg  = 
 | 
|  |    225 |     brokerstatus		# response to brokerstatusquery:
 | 
|  |    226 |   | proveravailmsg		# announce new prover is available
 | 
|  |    227 |   | newprovermsg		# new prover has started 
 | 
|  |    228 |   | proverstatemsg		# prover state has changed (busy/ready/exit)
 | 
|  |    229 | 
 | 
|  |    230 | brokerstatus  = element brokerstatus 
 | 
|  |    231 |                        { knownprovers, runningprovers, brokerinformation }
 | 
|  |    232 | 
 | 
|  |    233 | knownprover   = element knownprover   { componentid_attr, provername }
 | 
| 23434 |    234 | runningprover = element runningprover { componentid_attr, proverid_attr, provername }
 | 
| 17735 |    235 | 
 | 
|  |    236 | knownprovers   = element knownprovers { knownprover* }
 | 
|  |    237 | runningprovers = element runningprovers { runningprover* }
 | 
| 23434 |    238 | brokerinformation = element brokerinformation { string }
 | 
| 17735 |    239 | 
 | 
|  |    240 | proveravailmsg  = element proveravailable { provername_attr,
 | 
|  |    241 |                                             componentid_attr }
 | 
| 23434 |    242 | newprovermsg    = element proverstarted { proverid_attr
 | 
|  |    243 | 					, componentid_attr
 | 
|  |    244 | 		                        , provername_attr
 | 
|  |    245 | 		                        }
 | 
| 17735 |    246 | proverstatemsg = element proverstate { 
 | 
|  |    247 |                        proverid_attr, provername_attr,
 | 
|  |    248 |                        attribute proverstate {proverstate} } 
 | 
|  |    249 | 
 | 
|  |    250 | proverstate    = ("ready" | "busy" | "exitus")
 | 
|  |    251 | 
 | 
|  |    252 | # FIXME: This only allows provers to be available which are configured.
 | 
|  |    253 | #        In the long run, we want to change configurations while running.
 | 
|  |    254 | 
 | 
|  |    255 | 
 | 
|  |    256 | # ===========================================================================
 | 
|  |    257 | # 3. Display Commands
 | 
|  |    258 | # ===========================================================================
 | 
|  |    259 | 
 | 
|  |    260 | # Messages exchanged between broker and display
 | 
|  |    261 | 
 | 
|  |    262 |                         
 | 
|  |    263 | dispcmd = dispfilecmd | dispobjcmd  # display commands go from display to broker
 | 
|  |    264 | dispmsg = dispfilemsg | dispobjmsg  # display messages go from broker to display
 | 
|  |    265 |    
 | 
|  |    266 | 
 | 
|  |    267 | dispfilecmd = 
 | 
|  |    268 |     loadparsefile		# parse and load file
 | 
|  |    269 |   | newfilewith			# create new source file with given text
 | 
|  |    270 |   | dispopenfile		# open (or create) new file 
 | 
|  |    271 |   | savefile			# save opened file
 | 
|  |    272 |   | discardfile			# discard changes to opened file
 | 
|  |    273 | 
 | 
|  |    274 | dispfilemsg =
 | 
|  |    275 |     newfile			# announce creation of new file (in response to load/open)
 | 
| 23434 |    276 |   | filestatus			# announce change in status of file in broker
 | 
| 17735 |    277 | 
 | 
|  |    278 | # unique identifier of loaded files
 | 
| 23434 |    279 | srcid_attr = attribute srcid { token }
 | 
| 17735 |    280 | 
 | 
|  |    281 | loadparsefile = element loadparsefile { url_attr, proverid_attr }
 | 
| 23434 |    282 | newfilewith   = element newfilewith   { url_attr, proverid_attr, string }
 | 
| 17735 |    283 | dispopenfile  = element dispopenfile { url_attr,
 | 
|  |    284 |                                        proverid_attr,
 | 
|  |    285 |                                        attribute overwrite { xsd:boolean }?}
 | 
|  |    286 | savefile      = element savefile { srcid_attr,     
 | 
|  |    287 |                                    url_attr? }
 | 
|  |    288 | discardfile   = element discardfile { srcid_attr }
 | 
|  |    289 | 
 | 
|  |    290 | newfile       = element newfile  { proverid_attr, srcid_attr, url_attr }
 | 
| 23434 |    291 | filestatus    = element filestatus  { proverid_attr, srcid_attr, newstatus_attr, url_attr?,
 | 
| 17735 |    292 | 				      datetime_attr} 
 | 
|  |    293 | 
 | 
|  |    294 | newstatus_attr = attribute newstatus { "saved" | "changed" | "discarded" }
 | 
|  |    295 | 
 | 
|  |    296 | dispobjcmd =
 | 
|  |    297 |     setobjstate			# request of change of state 
 | 
| 23434 |    298 |   | editobj			# request edit operation of objects
 | 
| 17735 |    299 |   | createobj			# request creation of new objects
 | 
| 23434 |    300 | # Suggested May 06: probably add re-load flags instead 
 | 
|  |    301 | #  | reloadobjs                  # request relisting of all objects
 | 
| 17735 |    302 |   | inputcmd		        # process the command (generated by an input event)
 | 
|  |    303 |   | interruptprover		# send interrupt or kill signal to prover
 | 
|  |    304 | 
 | 
|  |    305 | dispobjmsg = element dispobjmsg { 
 | 
|  |    306 |       newobj+			# new objects have been created
 | 
|  |    307 |     | delobj+			# objects have been deleted
 | 
|  |    308 |     | replaceobjs		# objects are being replaced
 | 
|  |    309 |     | objectstate+		# objects have changed state
 | 
|  |    310 |     }
 | 
|  |    311 | 
 | 
|  |    312 | newobj = element newobj {
 | 
|  |    313 | 	    proverid_attr,
 | 
|  |    314 |             srcid_attr, 
 | 
|  |    315 | 	    objid_attr, 
 | 
|  |    316 |             attribute objposition { objid } ?,
 | 
|  |    317 |             objtype_attr ?,
 | 
|  |    318 |             attribute objparent { objid }?,
 | 
|  |    319 |             attribute objstate { objstate },
 | 
| 23434 |    320 | 	    # FIXME: would like to include metainfo here
 | 
|  |    321 |             # as (properscriptcmd, metainfo*) | unparseable
 | 
| 17735 |    322 |             (properscriptcmd | unparseable) }
 | 
|  |    323 | 
 | 
|  |    324 | replaceobjs = element replaceobjs {
 | 
|  |    325 | 	                srcid_attr,
 | 
|  |    326 | 	                attribute replacedfrom { objid }? ,
 | 
|  |    327 | 			attribute replacedto { objid }?,
 | 
| 23434 |    328 |                         delobj*,    # actually, either of delobj or 
 | 
|  |    329 |                         newobj* }   # newobj can be empty but not both.
 | 
| 17735 |    330 | 
 | 
|  |    331 | delobj = element delobj   { proverid_attr, srcid_attr, objid_attr }
 | 
|  |    332 | 
 | 
|  |    333 | objectstate = element objstate
 | 
|  |    334 |                        { proverid_attr, srcid_attr, objid_attr,
 | 
|  |    335 |                          attribute newstate {objstate} }
 | 
|  |    336 | 
 | 
|  |    337 | setobjstate = element setobjstate
 | 
|  |    338 |                   {  objid_attr, attribute newstate {objstate} }
 | 
|  |    339 | 
 | 
|  |    340 | editobj = element editobj { srcid_attr ?,
 | 
|  |    341 | 	                    attribute editfrom { objid }?,
 | 
|  |    342 |                             attribute editto   { objid }?,
 | 
| 23434 |    343 |                             string }
 | 
| 17735 |    344 | createobj = element createobj { srcid_attr ?, 
 | 
|  |    345 |                                 attribute objposition { objid }?, 
 | 
| 23434 |    346 |                                 string }
 | 
| 17735 |    347 | 
 | 
| 23434 |    348 | # Suggested May 06: probably add re-load flags instead 
 | 
|  |    349 | # reloadobjs = element reloadobjs { srcid_attr }
 | 
|  |    350 | 
 | 
|  |    351 | inputcmd       = element inputcmd { improper_attr, string }
 | 
| 17735 |    352 | improper_attr  = attribute improper { xsd:boolean }
 | 
|  |    353 | 
 | 
|  |    354 | interruptprover = element interruptprover 
 | 
|  |    355 |                           { interruptlevel_attr, proverid_attr }
 | 
|  |    356 | 
 | 
|  |    357 | interruptlevel_attr  = attribute interruptlevel { "interrupt" | "stop" | "kill" }
 | 
|  |    358 | 
 | 
|  |    359 | objid_attr = attribute objid { objid } 
 | 
| 23434 |    360 | objid      = token 
 | 
| 17735 |    361 | 
 | 
|  |    362 | objstate = 
 | 
|  |    363 |   ( "unparseable" | "parsed" | "being_processed" | "processed" | "outdated" )
 | 
|  |    364 | 
 | 
|  |    365 | 
 | 
|  |    366 | # ==============================================================================
 | 
|  |    367 | #  4. Prover Configuration
 | 
|  |    368 | # ==============================================================================
 | 
|  |    369 | 
 | 
|  |    370 | proverconfig =      
 | 
|  |    371 |    askpgip			# what version of PGIP do you support?
 | 
|  |    372 |  | askpgml			# what version of PGML do you support?
 | 
|  |    373 |  | askconfig			# tell me about objects and operations
 | 
|  |    374 |  | askprefs			# what preference settings do you offer?
 | 
|  |    375 |  | setpref			# please set this preference value 
 | 
|  |    376 |  | getpref			# please tell me this preference value
 | 
|  |    377 | 
 | 
|  |    378 | 
 | 
|  |    379 | 
 | 
| 23434 |    380 | prefcat_attr = attribute prefcategory { token }   # e.g. "expert", "internal", etc.
 | 
|  |    381 |                                                       # could be used for tabs in dialog
 | 
| 17735 |    382 | 
 | 
|  |    383 | askpgip   = element askpgip   { empty }
 | 
|  |    384 | askpgml   = element askpgml   { empty }
 | 
|  |    385 | askconfig = element askconfig { empty }
 | 
|  |    386 | askprefs  = element askprefs  { prefcat_attr? }
 | 
|  |    387 | setpref   = element setpref   { name_attr, prefcat_attr?, pgipvalue }
 | 
|  |    388 | getpref   = element getpref   { name_attr, prefcat_attr? }
 | 
|  |    389 | 
 | 
|  |    390 |  
 | 
|  |    391 | 
 | 
|  |    392 | # ==============================================================================
 | 
|  |    393 | #  5. Interface Configuration
 | 
|  |    394 | # ==============================================================================
 | 
|  |    395 | 
 | 
|  |    396 | kitconfig =        
 | 
|  |    397 |     usespgip			# I support PGIP, version ..
 | 
|  |    398 |   | usespgml			# I support PGML, version ..
 | 
|  |    399 |   | pgmlconfig			# configure PGML symbols
 | 
|  |    400 |   | proverinfo			# Report assistant information
 | 
|  |    401 |   | hasprefs			# I have preference settings ...
 | 
|  |    402 |   | prefval			# the current value of a preference is
 | 
|  |    403 |   | displayconfig		# configure the following object types and operations
 | 
|  |    404 |   | setids			# inform the interface about some known objects
 | 
|  |    405 |   | addids			# add some known identifiers
 | 
|  |    406 |   | delids			# retract some known identifers
 | 
|  |    407 |   | idvalue			# display the value of some identifier
 | 
|  |    408 |   | menuadd			# add a menu entry
 | 
|  |    409 |   | menudel			# remove a menu entry
 | 
|  |    410 | 
 | 
|  |    411 | # version reporting
 | 
| 23434 |    412 | version_attr  = attribute version { token }
 | 
| 17735 |    413 | usespgml = element usespgml  { version_attr }
 | 
|  |    414 | usespgip = element usespgip  { version_attr 
 | 
|  |    415 | 	                     , activecompspec
 | 
|  |    416 | 			     }
 | 
|  |    417 | 
 | 
|  |    418 | # These data from the component spec which an active component can override, or which
 | 
|  |    419 | # components initiating contact with the broker (e.g. incoming socket connections).
 | 
|  |    420 | # There are some restrictions: if we start a tool, the componentid and the type must be the
 | 
|  |    421 | # same as initially specified.
 | 
|  |    422 | activecompspec =  ( componentid_attr?   # unique identifier of component class
 | 
|  |    423 | 	          , componentname_attr? # Textual name of this component (overrides initial spec)
 | 
|  |    424 | 		  , componenttype?      # Type of component
 | 
| 23434 |    425 | 		  , systemattrs         # system attributes
 | 
| 17735 |    426 | 		  , acceptedpgipelems?  # list of accepted elements
 | 
|  |    427 | 		  )
 | 
|  |    428 | 
 | 
|  |    429 | 
 | 
|  |    430 | acceptedpgipelems = element acceptedpgipelems { singlepgipelem* }
 | 
|  |    431 | 
 | 
|  |    432 | singlepgipelem    = element pgipelem { 
 | 
|  |    433 |    attribute async { xsd:boolean }?,  # true if this command supported asynchronously (deflt false)
 | 
| 23434 |    434 | 				      # (otherwise part of usual ready/sync stream)
 | 
|  |    435 |    attribute attributes { text }?,    # comma-separated list of supported optional attribute names
 | 
|  |    436 | 				      # useful for: times attribute
 | 
|  |    437 |    text }                             # the unadorned name of the PGIP element (*not* an element)
 | 
| 17735 |    438 | 
 | 
|  |    439 | # PGML configuration
 | 
|  |    440 | pgmlconfig = element pgmlconfig { pgmlconfigure+ }
 | 
|  |    441 | 
 | 
|  |    442 | # Types for config settings: corresponding data values should conform to canonical
 | 
| 23434 |    443 | # representation for corresponding XML Schema 1.0 Datatypes.  
 | 
| 17735 |    444 | #
 | 
|  |    445 | # In detail:
 | 
| 23434 |    446 | #  pgipnull   = empty
 | 
| 17735 |    447 | #  pgipbool   = xsd:boolean = true | false
 | 
|  |    448 | #  pgipint    = xsd:integer = (-)?(0-9)+     (canonical: no leading zeroes)
 | 
| 23434 |    449 | #  pgipstring = string  =  <any non-empty character sequence>
 | 
| 17735 |    450 | #  pgipchoice = cf xs:choice  = type1 | type2 | ... | typen
 | 
|  |    451 | 
 | 
| 23434 |    452 | pgiptype   = pgipnull | pgipbool | pgipint | pgipstring | pgipchoice | pgipconst
 | 
| 17735 |    453 | 
 | 
| 23434 |    454 | pgipnull   = element pgipnull { descr_attr?, empty }
 | 
|  |    455 | pgipbool   = element pgipbool { descr_attr?, empty }
 | 
|  |    456 | pgipint    = element pgipint  { min_attr?, max_attr?, descr_attr?, empty }
 | 
| 17735 |    457 | min_attr   = attribute min { xsd:integer }
 | 
|  |    458 | max_attr   = attribute max { xsd:integer }
 | 
| 23434 |    459 | pgipstring = element pgipstring { descr_attr?, empty }
 | 
|  |    460 | pgipconst  = element pgipconst { name_attr, descr_attr? } 
 | 
|  |    461 |       # FIXME: Temporary fix because Isabelle does it wrong -- should be empty }
 | 
| 17735 |    462 | pgipchoice = element pgipchoice { pgiptype+ }
 | 
|  |    463 | 
 | 
| 23434 |    464 | # Notes on pgipchoice:
 | 
|  |    465 | # 1. Choices must not be nested (i.e. must not contain other choices)
 | 
|  |    466 | # 2. The description attributes for pgipbool, pgipint, pgipstring and pgipconst
 | 
|  |    467 | #    are for use with pgipchoice: they can be used as a user-visible label
 | 
|  |    468 | #    when representing the choice to the user (e.g. in a pull-down menu).
 | 
|  |    469 | # 3. A pgipchoice should have an unambiguous representation as a string. That means
 | 
|  |    470 | #    all constants in the choice must have different names, and a choice must not
 | 
|  |    471 | #    contain more than one each of pgipint, pgipstring and pgipbool.
 | 
|  |    472 | 
 | 
|  |    473 | pgipvalue  = string
 | 
| 17735 |    474 | 
 | 
|  |    475 | icon  = element icon { xsd:base64Binary }  # image data for an icon
 | 
|  |    476 | 
 | 
| 23434 |    477 | # The default value of a preference as a string (using the unambiguous
 | 
|  |    478 | # conversion to string mentioned above). A string value will always be quoted
 | 
|  |    479 | # to distinguish it from constants or integers.
 | 
|  |    480 | default_attr = attribute default { token }
 | 
|  |    481 | 
 | 
|  |    482 | # Description of a choice.  If multi-line, first line is short tip.
 | 
|  |    483 | descr_attr   = attribute descr { string }
 | 
| 17735 |    484 | 
 | 
|  |    485 | # icons for preference recommended size: 32x32 
 | 
|  |    486 | # top level preferences: may be used in dialog for preference setting
 | 
|  |    487 | # object preferences: may be used as an "emblem" to decorate 
 | 
|  |    488 | # object icon (boolean preferences with default false, only)
 | 
|  |    489 | haspref = element haspref  { 
 | 
|  |    490 |    name_attr, descr_attr?, 
 | 
|  |    491 |    default_attr?, icon?,
 | 
|  |    492 |    pgiptype
 | 
|  |    493 | }
 | 
|  |    494 | 
 | 
| 23434 |    495 | 
 | 
|  |    496 | 
 | 
| 17735 |    497 | hasprefs = element hasprefs { prefcat_attr?, haspref* }
 | 
|  |    498 | 
 | 
|  |    499 | prefval = element prefval { name_attr, pgipvalue } 
 | 
|  |    500 | 
 | 
|  |    501 | # menu items (incomplete, FIXME)
 | 
| 23434 |    502 | path_attr = attribute path { token }
 | 
| 17735 |    503 | 
 | 
|  |    504 | menuadd  = element menuadd  { path_attr?, name_attr?, opn_attr? }
 | 
|  |    505 | menudel  = element menudel  { path_attr?, name_attr? }
 | 
|  |    506 | opn_attr = attribute operation { token }
 | 
|  |    507 | 
 | 
|  |    508 | 
 | 
|  |    509 | # Display configuration information: 
 | 
|  |    510 | # basic prover information, lexical structure of files, 
 | 
|  |    511 | # an icon for the prover, help documents, and the 
 | 
|  |    512 | # objects, types, and operations for building proof commands.
 | 
|  |    513 | 
 | 
|  |    514 | # NB: the following object types have a fixed interpretation 
 | 
| 23434 |    515 | # in PGIP:
 | 
|  |    516 | #        "identifier":   an identifier in the identifier syntax
 | 
|  |    517 | #           "comment":   an arbitrary sequence of characters
 | 
|  |    518 | #	    "theorem":   a theorem name or text
 | 
|  |    519 | #	    "theory" :   a theory name or text
 | 
|  |    520 | #	    "file" :     a file name
 | 
| 17735 |    521 | 
 | 
|  |    522 | displayconfig =
 | 
|  |    523 |   element displayconfig { 
 | 
|  |    524 |      welcomemsg?, icon?, helpdoc*, lexicalstructure*,
 | 
|  |    525 |      objtype*, opn* }
 | 
|  |    526 | 
 | 
| 23434 |    527 | objtype = element objtype { name_attr, descr_attr?, icon?,  contains*, hasprefs?  }
 | 
| 17735 |    528 | 
 | 
|  |    529 | objtype_attr = attribute objtype { token }           # the name of an objtype
 | 
|  |    530 | contains = element contains { objtype_attr, empty }  #  a container for other objtypes
 | 
|  |    531 | 
 | 
| 23434 |    532 | opn = element opn { 
 | 
|  |    533 |    name_attr, 
 | 
|  |    534 |    descr_attr?,
 | 
|  |    535 |    inputform?,	  # FIXME: can maybe remove this?
 | 
|  |    536 |    opsrc*,	  # FIXME: incompat change wanted: have list of source elts, not spaces
 | 
|  |    537 |    optrg, 
 | 
|  |    538 |    opcmd, 
 | 
|  |    539 |    improper_attr? }
 | 
| 17735 |    540 | 
 | 
| 23434 |    541 | opsrc = 
 | 
|  |    542 |    element opsrc {	  
 | 
|  |    543 |       name_attr?,         # %name as an alternative to %number
 | 
|  |    544 |       selnumber_attr?,    # explicit number for %number, the nth item selected
 | 
|  |    545 |       prompt_attr?,	  # prompt in form or tooltip in template
 | 
|  |    546 |       listwithsep_attr?,  # list of args of this type with given separator
 | 
|  |    547 |       list { token* } }   # source types: a space separated list
 | 
|  |    548 | 			  # FIXME incompat change wanted: just have one source here
 | 
|  |    549 | 			  # FIXME: need to add optional pgiptype
 | 
|  |    550 | 
 | 
|  |    551 | listwithsep_attr =  attribute listwithsep { token }
 | 
|  |    552 | selnumber_attr =    attribute selnumber { xsd:positiveInteger }
 | 
|  |    553 | prompt_attr =       attribute prompt { string }
 | 
|  |    554 | 
 | 
|  |    555 | optrg = 
 | 
|  |    556 |    element optrg { token }?           # single target type, empty for proof command
 | 
|  |    557 | opcmd = 
 | 
|  |    558 |    element opcmd { string }           # prover command, with printf-style "%1"-args
 | 
|  |    559 | 					   #  (whitespace preserved here: literal text)
 | 
| 17735 |    560 | 
 | 
|  |    561 | # interactive operations - require some input
 | 
|  |    562 | inputform = element inputform { field+ }  
 | 
|  |    563 | 
 | 
|  |    564 | # a field has a PGIP config type (int, string, bool, choice(c1...cn)) and a name; under that
 | 
|  |    565 | # name, it will be substituted into the command Ex. field name=number opcmd="rtac %1 %number"
 | 
|  |    566 | 
 | 
|  |    567 | field = element field { 
 | 
|  |    568 |    name_attr, pgiptype,
 | 
| 23434 |    569 |    element prompt { string }
 | 
| 17735 |    570 | }
 | 
|  |    571 | 
 | 
|  |    572 | # identifier tables: these list known items of particular objtype.
 | 
|  |    573 | # Might be used for completion or menu selection, and inspection.
 | 
|  |    574 | # May have a nested structure (but objtypes do not).
 | 
|  |    575 | 
 | 
|  |    576 | setids  = element setids { idtable* }   # (with an empty idtable, clear table)
 | 
|  |    577 | addids  = element addids { idtable* }
 | 
|  |    578 | delids  = element delids { idtable* }
 | 
|  |    579 | 
 | 
| 23434 |    580 | # give value of some identifier (response to showid; same values returned)
 | 
| 17735 |    581 | idvalue = element idvalue               
 | 
| 23434 |    582 |    {  thyname_attr?, name_attr, objtype_attr, pgmltext }
 | 
| 17735 |    583 | 
 | 
|  |    584 | idtable    = element idtable { context_attr?, objtype_attr, identifier* }
 | 
|  |    585 | identifier = element identifier { token }
 | 
|  |    586 | 
 | 
|  |    587 | context_attr = attribute context { token } # parent identifier (context) 
 | 
|  |    588 | 
 | 
|  |    589 | # prover information: 
 | 
|  |    590 | # name, instance (e.g. in case of major parameter of invocation);
 | 
|  |    591 | # description, version, homepage,  welcome message, docs available
 | 
|  |    592 | proverinfo = element proverinfo 
 | 
|  |    593 |    { name_attr, version_attr?, instance_attr?,
 | 
|  |    594 |      descr_attr?, url_attr?, filenameextns_attr?, 
 | 
|  |    595 | ## TEMP: these elements are duplicated in displayconfig, as they're
 | 
|  |    596 | ## moving there.  
 | 
|  |    597 |       welcomemsg?, icon?, helpdoc*, lexicalstructure* }
 | 
|  |    598 | 
 | 
| 23434 |    599 | instance_attr = attribute instance { token }
 | 
|  |    600 | 
 | 
|  |    601 | welcomemsg = element welcomemsg { string }
 | 
| 17735 |    602 | 
 | 
|  |    603 | # helpdoc: advertise availability of some documentation, given a canonical
 | 
|  |    604 | # name, textual description, and URL or viewdoc argument.
 | 
|  |    605 | # 
 | 
| 23434 |    606 | helpdoc = element helpdoc { name_attr, descr_attr, url_attr?, token } # token string is arg to "viewdoc"
 | 
| 17735 |    607 | 
 | 
| 23434 |    608 | filenameextns_attr = attribute filenameextns { xsd:NMTOKENS } # space-separated extensions sans "."
 | 
| 17735 |    609 | 
 | 
|  |    610 | # lexical structure of proof texts
 | 
|  |    611 | lexicalstructure = 
 | 
|  |    612 |    element lexicalstructure {
 | 
|  |    613 |       keyword*,
 | 
|  |    614 |       stringdelimiter*,
 | 
|  |    615 |       escapecharacter?,
 | 
|  |    616 |       commentdelimiter*,
 | 
|  |    617 |       identifiersyntax?
 | 
|  |    618 |    }
 | 
|  |    619 | 
 | 
|  |    620 | keyword = element keyword {
 | 
| 23434 |    621 |    attribute word { token },
 | 
| 17735 |    622 |    shorthelp?,
 | 
|  |    623 |    longhelp? }
 | 
|  |    624 | 
 | 
| 23434 |    625 | shorthelp = element shorthelp { string }   # one-line (tooltip style) help 
 | 
|  |    626 | longhelp  = element longhelp { string }    # multi-line help
 | 
| 17735 |    627 | 
 | 
| 23434 |    628 | stringdelimiter = element stringdelimiter { token }  # should be a single char
 | 
| 17735 |    629 | 
 | 
|  |    630 | # The escape character is used to escape strings and other special characters - in most languages it is \
 | 
| 23434 |    631 | escapecharacter = element escapecharacter { token }  # should be a single char
 | 
| 17735 |    632 | 
 | 
|  |    633 | commentdelimiter = element commentdelimiter { 
 | 
| 23434 |    634 |    attribute start { token },
 | 
|  |    635 |    attribute end { token }?,
 | 
| 17735 |    636 |    empty
 | 
|  |    637 |   }
 | 
|  |    638 | 
 | 
|  |    639 | 
 | 
|  |    640 | # syntax for ids: id = initial allowed*  or id = allowed+ if initial empty
 | 
|  |    641 | identifiersyntax = element identifiersyntax { 
 | 
| 23434 |    642 |    attribute initialchars { token }?,
 | 
|  |    643 |    attribute allowedchars { token }
 | 
| 17735 |    644 | }
 | 
|  |    645 | 
 | 
|  |    646 | # ==============================================================================
 | 
|  |    647 | # 6. Prover Control
 | 
|  |    648 | # ==============================================================================
 | 
|  |    649 | 
 | 
|  |    650 | provercontrol = 
 | 
|  |    651 |    proverinit			# reset prover to its initial state
 | 
|  |    652 |  | proverexit			# exit prover
 | 
|  |    653 |  | startquiet			# stop prover sending proof state displays, non-urgent messages
 | 
|  |    654 |  | stopquiet			# turn on normal proof state & message displays
 | 
|  |    655 |  | pgmlsymbolson		# activate use of symbols in PGML output (input always understood)
 | 
|  |    656 |  | pgmlsymbolsoff		# deactivate use of symbols in PGML output
 | 
| 23434 |    657 |  | setproverflag		# set/clear a standard control flag (supersedes above)
 | 
| 17735 |    658 | 
 | 
|  |    659 | proverinit     = element proverinit { empty }  
 | 
|  |    660 | proverexit     = element proverexit { empty }
 | 
| 23434 |    661 | startquiet     = element startquiet { empty }      # DEPRECATED 
 | 
|  |    662 | stopquiet      = element stopquiet  { empty }      # DEPRECATED 
 | 
|  |    663 | pgmlsymbolson  = element pgmlsymbolson { empty }   # DEPRECATED
 | 
|  |    664 | pgmlsymbolsoff = element pgmlsymbolsoff { empty }  # DEPRECATED
 | 
| 17735 |    665 | 
 | 
| 23434 |    666 | setproverflag  = element setproverflag { flagname_attr, 
 | 
|  |    667 | 					 attribute value { xsd:boolean } }
 | 
|  |    668 | flagname_attr  = 
 | 
|  |    669 |    attribute flagname { "quiet" 
 | 
|  |    670 | 		      | "pgmlsymbols" 
 | 
|  |    671 | 		      | "metainfo:thmdeps" 
 | 
|  |    672 | 		      }
 | 
| 17735 |    673 | 
 | 
|  |    674 | # General prover output/responses
 | 
|  |    675 | 
 | 
| 23434 |    676 | # Prover output has an otional proverid_attribute. This is set by the broker when relaying 
 | 
|  |    677 | # prover output to displays. When producing output, provers can and should not set this
 | 
|  |    678 | # attribute. 
 | 
| 17735 |    679 | 
 | 
|  |    680 | proveroutput =
 | 
|  |    681 |    ready			# prover is ready for input
 | 
|  |    682 |  | cleardisplay			# prover requests a display area to be cleared
 | 
|  |    683 |  | proofstate			# prover outputs the proof state
 | 
|  |    684 |  | normalresponse		# prover outputs some display
 | 
|  |    685 |  | errorresponse		# prover indicates an error/warning/debug condition, with message
 | 
|  |    686 |  | scriptinsert			# some text to insert literally into the proof script
 | 
|  |    687 |  | metainforesponse		# prover outputs some other meta-information to interface
 | 
|  |    688 |  | parseresult			# results of a <parsescript> request (see later)
 | 
|  |    689 | 
 | 
|  |    690 | ready = element ready { empty }
 | 
|  |    691 | 
 | 
|  |    692 | displayarea = "status"		# a status line
 | 
| 23434 |    693 | 	    | "message"		# the message area (e.g. response buffer, perhaps swapped into view)
 | 
|  |    694 |             | "display"		# the main display area (e.g. goals buffer, usually persistent)
 | 
| 17735 |    695 | 	    | token		# prover-specified window name
 | 
|  |    696 | 
 | 
|  |    697 | cleardisplay = 
 | 
|  |    698 |    element cleardisplay {
 | 
|  |    699 |       proverid_attr?,
 | 
|  |    700 |       attribute area { 
 | 
|  |    701 |          displayarea | "all" } }           
 | 
|  |    702 | 
 | 
|  |    703 | 
 | 
|  |    704 | proofstate = 
 | 
|  |    705 |   element proofstate { proverid_attr?, pgml }
 | 
|  |    706 | 
 | 
|  |    707 | messagecategory =		# attribution of message
 | 
|  |    708 |    "internal"			#  - internal debug message (interface should usually hide)
 | 
|  |    709 |  | "information"		#  - user-level debug/info message (interface may hide)
 | 
|  |    710 |  | "tracing"			#  - user-level "tracing" message (possibly voluminous)
 | 
|  |    711 | 
 | 
|  |    712 | normalresponse =                           
 | 
|  |    713 |   element normalresponse { 
 | 
| 23434 |    714 |     proverid_attr?,				    # if no proverid, assume message is from broker
 | 
| 17735 |    715 |     attribute area { displayarea },
 | 
|  |    716 |     attribute messagecategory { messagecategory }?, # optional extra category (e.g. tracing/debug)
 | 
| 23434 |    717 |     attribute urgent { xsd:boolean }?,              # message should be brought to users attention
 | 
| 17735 |    718 |     pgmltext 
 | 
|  |    719 | }
 | 
|  |    720 | 
 | 
|  |    721 | ## Error messages:  these are different from ordinary messages in that
 | 
| 23434 |    722 | ## they indicate an error condition in the prover, with a notion
 | 
|  |    723 | ## of fatality and (optionally) a location.  The interface may collect these
 | 
|  |    724 | ## messages in a log, display in a modal dialog, or in the specified
 | 
|  |    725 | ## display area if one is given
 | 
|  |    726 | ## 
 | 
|  |    727 | ## Error responses are also taken to indicate failure of a command to be processed, but only in
 | 
|  |    728 | ## the special case of a response with fatality "fatal".  If any errorresponse with
 | 
|  |    729 | ## fatality=fatal is sent before <ready/>, the PGIP command which triggered the message is
 | 
|  |    730 | ## considered to have failed.  If the command is a scripting command, it will not be added to
 | 
|  |    731 | ## the successfully processed part of the document.  A "nonfatal" error also indicates some
 | 
|  |    732 | ## serious problem with the sent command, but it is not considered to have failed.  This is the
 | 
|  |    733 | ## ordinary response for
 | 
| 17735 |    734 | 
 | 
|  |    735 | errorresponse = 
 | 
|  |    736 |    element errorresponse { 
 | 
| 23434 |    737 |      proverid_attr?,				   #  ... as above ...
 | 
| 17735 |    738 |      attribute area { displayarea }?,
 | 
|  |    739 |      attribute fatality { fatality },
 | 
|  |    740 |      location_attrs,
 | 
|  |    741 |      pgmltext
 | 
|  |    742 |   }
 | 
|  |    743 | 
 | 
|  |    744 | fatality =	  # degree of error conditions:
 | 
| 23434 |    745 |    "info"	  #  - info message
 | 
|  |    746 |  | "warning"      #  - warning message
 | 
|  |    747 |  | "nonfatal"     #  - error message, recovered and state updated
 | 
|  |    748 |  | "fatal"        #  - error message, command has failed
 | 
| 17735 |    749 |  | "panic"        #  - shutdown condition, component exits (interface may show message)
 | 
| 23434 |    750 |  | "log"          #  - system-level log message (interface does not show message; written to log file)
 | 
|  |    751 |  | "debug"        #  - system-level debug message (interface may show message; written to log file)
 | 
| 17735 |    752 | 
 | 
|  |    753 | # attributes describing a file location (for error messages, etc)
 | 
|  |    754 | location_attrs = 
 | 
| 23434 |    755 |      attribute location_descr    { string }?,
 | 
| 17735 |    756 |      attribute location_url      { xsd:anyURI }?,
 | 
|  |    757 |      attribute locationline      { xsd:positiveInteger }?,
 | 
|  |    758 |      attribute locationcolumn    { xsd:positiveInteger }?,
 | 
| 23434 |    759 |      attribute locationcharacter { xsd:positiveInteger }?,
 | 
|  |    760 |      attribute locationlength    { xsd:positiveInteger }?
 | 
| 17735 |    761 | 
 | 
| 23434 |    762 | # instruction to insert some literal text into the document
 | 
|  |    763 | scriptinsert = element scriptinsert { proverid_attr?, metavarid_attr?, string }
 | 
| 17735 |    764 | 
 | 
|  |    765 | 
 | 
|  |    766 | # metainformation is an extensible place to put system-specific information
 | 
|  |    767 | 
 | 
| 23434 |    768 | value = element value { name_attr?, text }        # generic value holder [ deprecated: use metainfo ]
 | 
|  |    769 | metainfo = element metainfo { name_attr?, text }  # generic info holder
 | 
| 17735 |    770 | 
 | 
|  |    771 | metainforesponse = 
 | 
|  |    772 |    element metainforesponse { 
 | 
|  |    773 |       proverid_attr?,
 | 
| 23434 |    774 |       attribute infotype { token },      # categorization of data
 | 
|  |    775 |       (value | metainfo)* }              # data values/text
 | 
| 17735 |    776 | 
 | 
|  |    777 | 
 | 
|  |    778 | # ==============================================================================
 | 
|  |    779 | # 7. Proof script markup and proof control 
 | 
|  |    780 | # ==============================================================================
 | 
|  |    781 | 
 | 
| 23434 |    782 | # properproofcmds are purely markup on native proof script (plain) text
 | 
| 17735 |    783 | properproofcmd =
 | 
|  |    784 |     opengoal        # open a goal in ambient context
 | 
|  |    785 |   | proofstep       # a specific proof command (perhaps configured via opcmd) 
 | 
|  |    786 |   | closegoal       # complete & close current open proof (succeeds iff proven, may close nested pf)
 | 
|  |    787 |   | giveupgoal      # close current open proof, retaining attempt in script (Isar oops)
 | 
|  |    788 |   | postponegoal    # close current open proof, record as proof obl'n  (Isar sorry)  
 | 
|  |    789 |   | comment         # a proof script comment; text probably ignored by prover 
 | 
| 23434 |    790 |   | doccomment      # a proof script document comment; text maybe processed by prover 
 | 
| 17735 |    791 |   | whitespace      # a whitespace comment; text ignored by prover
 | 
|  |    792 |   | spuriouscmd     # command ignored for undo, e.g. "print x", could be pruned from script
 | 
|  |    793 |   | badcmd          # a command which should not be stored in the script (e.g. an improperproofcmd)
 | 
| 23434 |    794 |   | litcomment      # a PGIP literate comment (never passed to prover)
 | 
| 17735 |    795 |   | pragma	    # a document generating instruction (never passed to prover)
 | 
|  |    796 | 
 | 
|  |    797 | # improperproofcmds are commands which are never stored in the script
 | 
|  |    798 | improperproofcmd =
 | 
|  |    799 |     dostep        # issue a properproofcmd (without passing in markup)
 | 
|  |    800 |   | undostep      # undo the last proof step issued in currently open goal 
 | 
|  |    801 |   | redostep      # redo the last undone step issued in currently open goal (optionally supported)
 | 
|  |    802 |   | abortgoal     # give up on current open proof, close proof state, discard history
 | 
|  |    803 |   | forget        # forget a theorem (or named target), outdating dependent theorems
 | 
|  |    804 |   | restoregoal   # re-open previously postponed proof, outdating dependent theorems
 | 
|  |    805 | 
 | 
| 23434 |    806 | # In future we may allow input to contain markup; for now it is treated uniformly as plain text.
 | 
|  |    807 | 
 | 
|  |    808 | opengoal     = element opengoal     { display_attr?, thmname_attr?, string } # FIXME: add objprefval
 | 
|  |    809 | proofstep    = element proofstep    { display_attr?, name_attr?, objtype_attr?, string }
 | 
|  |    810 | closegoal    = element closegoal    { display_attr?, string }
 | 
|  |    811 | giveupgoal   = element giveupgoal   { display_attr?, string }
 | 
|  |    812 | postponegoal = element postponegoal { display_attr?, string }
 | 
|  |    813 | comment      = element comment      { display_attr?, string }
 | 
|  |    814 | doccomment   = element doccomment   { display_attr?, string }
 | 
|  |    815 | whitespace   = element whitespace   { display_attr?, string }
 | 
| 17735 |    816 | 
 | 
|  |    817 | display_attr = attribute nodisplay { xsd:boolean }  # whether to display in documentation
 | 
|  |    818 | 
 | 
| 23434 |    819 | spuriouscmd  = element spuriouscmd { string }  # no semantic effect (e.g. print)
 | 
|  |    820 | badcmd       = element badcmd { string }       # illegal in script (e.g. undo)
 | 
|  |    821 | nonscripting = element nonscripting { string } # non-scripting text (different doc type)
 | 
| 17735 |    822 | 
 | 
|  |    823 | litcomment  = element litcomment { format_attr?, (text | directive)* }
 | 
|  |    824 | directive   = element directive { (proofctxt,pgml) }
 | 
|  |    825 | format_attr = attribute format { token }
 | 
|  |    826 | 
 | 
|  |    827 | pragma       = showhidecode | setformat
 | 
|  |    828 | showhidecode = element showcode { attribute show { xsd:boolean } }
 | 
|  |    829 | setformat    = element setformat { format_attr }
 | 
|  |    830 | 
 | 
| 23434 |    831 | dostep       = element dostep { string }
 | 
|  |    832 | undostep     = element undostep { times_attr? }
 | 
|  |    833 | redostep     = element redostep { times_attr? }
 | 
| 17735 |    834 | abortgoal    = element abortgoal { empty }
 | 
|  |    835 | forget       = element forget { thyname_attr?, name_attr?, objtype_attr? }
 | 
|  |    836 | restoregoal  = element restoregoal { thmname_attr }
 | 
|  |    837 | 
 | 
| 23434 |    838 | times_attr   = attribute times { xsd:positiveInteger }
 | 
|  |    839 | 
 | 
| 17735 |    840 | # empty objprefval element is used for object prefs in script markup 
 | 
|  |    841 | objprefval = element objprefval { name_attr, val_attr, empty }
 | 
| 23434 |    842 | val_attr   = attribute value { token }
 | 
| 17735 |    843 | 
 | 
|  |    844 | 
 | 
|  |    845 | 
 | 
|  |    846 | 
 | 
|  |    847 | # =======================================================
 | 
|  |    848 | # Inspecting the proof context, etc.
 | 
|  |    849 | 
 | 
| 23434 |    850 | # NB: ids/refs/parent: work in progress, liable to change.
 | 
|  |    851 | 
 | 
| 17735 |    852 | proofctxt =
 | 
| 23434 |    853 |     askids         # tell me about identifiers (given objtype in a theory)
 | 
|  |    854 |   | askrefs        # tell me about dependencies (references) of an identifier
 | 
|  |    855 | #  | askparent      # tell me the container for some identifier
 | 
|  |    856 |   | showid         # print the value of some object
 | 
|  |    857 |   | askguise       # tell me about the current state of the prover
 | 
| 17735 |    858 |   | parsescript    # parse a raw proof script into proofcmds
 | 
|  |    859 |   | showproofstate # (re)display proof state (empty if outside a proof)
 | 
|  |    860 |   | showctxt       # show proof context
 | 
|  |    861 |   | searchtheorems # search for theorems (prover-specific arguments)  
 | 
|  |    862 |   | setlinewidth   # set line width for printing
 | 
|  |    863 |   | viewdoc        # request some on-line help (prover-specific arg)
 | 
|  |    864 | 
 | 
|  |    865 | askids = element askids  { thyname_attr?, objtype_attr? }
 | 
|  |    866 | 	# Note that thyname_attr is *required* for certain objtypes (e.g. theorem).
 | 
|  |    867 | 	# This is because otherwise the list is enormous.
 | 
|  |    868 | 	# Perhaps we should make thyname_attr obligatory? 
 | 
|  |    869 | 	# With a blank entry (i.e. thyname="") allowed for listing theories, or for when 
 | 
| 23434 |    870 | 	# you really do want to see everything (could be a shell-style glob)
 | 
|  |    871 | 
 | 
|  |    872 | 
 | 
|  |    873 | # askids:    container -> identifiers contained within
 | 
|  |    874 | # askparent: identifier + type + context -> container
 | 
|  |    875 | # askrers:   identifier + type + context -> identifiers which are referenced 
 | 
|  |    876 | #
 | 
|  |    877 | askrefs = element askrefs { url_attr?, thyname_attr?, objtype_attr?, name_attr? }
 | 
|  |    878 | # TODO: maybe include guises here as indication of reference point.  
 | 
|  |    879 | # setrefs in reply to askrefs only really needs identifiers, but it's nice to
 | 
|  |    880 | # support voluntary information too.
 | 
|  |    881 | setrefs = element setrefs { url_attr?, thyname_attr?, objtype_attr?, name_attr?, idtable*, fileurl* }
 | 
|  |    882 | fileurl = element fileurl { url_attr }
 | 
|  |    883 | # telldeps = element telldeps { thyname_attr?, objtype_attr, name_attr?, identifier* }
 | 
|  |    884 | # Idea: for a theory dependency we return a single file (URL), the containing file.
 | 
|  |    885 | #       for a file dependency we return urls of parent files,
 | 
|  |    886 | #       for theorem dependency we return theory
 | 
|  |    887 | #       for term dependency we return definition (point in file)
 | 
|  |    888 | 
 | 
| 17735 |    889 | 
 | 
|  |    890 | showid = element showid  { thyname_attr?, objtype_attr, name_attr }
 | 
|  |    891 | 
 | 
|  |    892 | askguise = element askguise { empty }
 | 
|  |    893 | 
 | 
| 23434 |    894 | showproofstate = element showproofstate { empty }
 | 
|  |    895 | showctxt       = element showctxt { empty }
 | 
|  |    896 | searchtheorems = element searchtheorems { string }
 | 
|  |    897 | setlinewidth   = element setlinewidth { xsd:positiveInteger }
 | 
|  |    898 | viewdoc        = element viewdoc { token }
 | 
|  |    899 | 
 | 
| 17735 |    900 | 
 | 
|  |    901 | # =======================================================
 | 
| 23434 |    902 | # Proof script documents and parsing proof scripts
 | 
|  |    903 | 
 | 
|  |    904 | # A PGIP document is a sequence of script commands, each of which
 | 
|  |    905 | # may have meta information attached.
 | 
|  |    906 | properscriptcmdmetainfo = properscriptcmd, metainfo*
 | 
|  |    907 | pgipdoc = element pgipdoc { properscriptcmdmetainfo* }
 | 
|  |    908 | 
 | 
| 17735 |    909 | 
 | 
|  |    910 | # NB: parsing needs only be supported for "proper" proof commands,
 | 
|  |    911 | # which may appear in proof texts.  The groupdelimiters are purely
 | 
|  |    912 | # markup hints to the interface for display structure on concrete syntax.
 | 
|  |    913 | # The location attributes can be used by the prover in <parsescript> to
 | 
|  |    914 | # generate error messages for particular locations; they can be used 
 | 
|  |    915 | # in <parseresult> to pass position information back to the display,
 | 
|  |    916 | # particularly in the case of (re-)parsing only part of a file.
 | 
|  |    917 | # The parsing component MUST return the same location attributes
 | 
|  |    918 | # (and system data attribute) that was passed in.
 | 
|  |    919 | 
 | 
|  |    920 | parsescript = element parsescript
 | 
| 23434 |    921 |                  { location_attrs, systemdata_attr, string }
 | 
| 17735 |    922 |        
 | 
|  |    923 | parseresult = element parseresult { location_attrs, systemdata_attr,
 | 
|  |    924 | 				    singleparseresult* }
 | 
|  |    925 | 
 | 
| 23434 |    926 | # Really we'd like parsing to return properscriptcmdmetainfo as a single
 | 
|  |    927 | # result (and similarly for newobj).  
 | 
|  |    928 | # Unfortunately, although this is an XML-transparent extension, it
 | 
|  |    929 | # messes up the Haskell schema-fixed code rather extensively, so for
 | 
|  |    930 | # now we just treat metainfo at the same level as the other results,
 | 
|  |    931 | # although it should only appear following a properscriptcmd.
 | 
| 17735 |    932 | 
 | 
| 23434 |    933 | singleparseresult  = properscriptcmd | metainfo | unparseable | errorresponse
 | 
|  |    934 | 
 | 
|  |    935 | unparseable = element unparseable { string }
 | 
| 17735 |    936 | properscriptcmd = properproofcmd | properfilecmd | groupdelimiter
 | 
|  |    937 | 
 | 
|  |    938 | 
 | 
| 23434 |    939 | 
 | 
|  |    940 | 
 | 
| 17735 |    941 | groupdelimiter = openblock | closeblock
 | 
| 23434 |    942 | openblock  = element openblock { 
 | 
|  |    943 |    name_attr?, objtype_attr?, 
 | 
|  |    944 |    metavarid_attr?, positionid_attr?,
 | 
|  |    945 |    fold_attr?, indent_attr? }
 | 
| 17735 |    946 | closeblock = element closeblock { empty }
 | 
|  |    947 | 
 | 
|  |    948 | # 
 | 
| 23434 |    949 | metavarid_attr  = attribute metavarid { token }
 | 
|  |    950 | positionid_attr = attribute positionid { token }
 | 
|  |    951 | fold_attr       = attribute fold { xsd:boolean }
 | 
|  |    952 | indent_attr     = attribute indent { xsd:integer }
 | 
| 17735 |    953 | 
 | 
|  |    954 | 
 | 
|  |    955 | # =======================================================
 | 
|  |    956 | # Theory/file handling
 | 
|  |    957 | 
 | 
|  |    958 | properfilecmd =     # (NB: properfilecmds are purely markup on proof script text)
 | 
|  |    959 |     opentheory      # begin construction of a new theory.  
 | 
|  |    960 |   | theoryitem      # a step in a theory (e.g. declaration/definition of type/constant).
 | 
|  |    961 |   | closetheory     # complete construction of the currently open theory
 | 
|  |    962 | 
 | 
|  |    963 | improperfilecmd = 
 | 
|  |    964 |     doitem	    # issue a proper file command (without passing in markup)
 | 
|  |    965 |   | undoitem	    # undo last step (or named item) in theory construction
 | 
|  |    966 |   | redoitem	    # redo last step (or named item) in theory construction (optionally supported)
 | 
|  |    967 |   | aborttheory     # abort currently open theory
 | 
|  |    968 |   | retracttheory   # retract a named theory
 | 
| 23434 |    969 |   | openfile        # signal a file is being opened for constructing a proof text interactively
 | 
|  |    970 |   | closefile       # close the currently open file, suggesting it has been processed
 | 
| 17735 |    971 |   | abortfile       # unlock a file, suggesting it hasn't been processed
 | 
| 23434 |    972 |   | loadfile        # load (i.e. process directly) a file possibly containing theory definition(s)
 | 
|  |    973 |   | retractfile     # retract a given file (including all contained theories) 
 | 
| 17735 |    974 |   | changecwd       # change prover's working directory (or load path) for files
 | 
|  |    975 |   | systemcmd       # system (other) command, parsed internally
 | 
|  |    976 | 
 | 
|  |    977 | fileinfomsg = 
 | 
|  |    978 |    informfileloaded       # prover informs interface a particular file is loaded
 | 
|  |    979 |  | informfileretracted    # prover informs interface a particular file is outdated
 | 
|  |    980 |  | informguise		  # prover informs interface about current state
 | 
|  |    981 | 
 | 
| 23434 |    982 | opentheory    = element opentheory    { thyname_attr, parentnames_attr?, string }
 | 
|  |    983 | closetheory   = element closetheory   { string }
 | 
|  |    984 | theoryitem    = element theoryitem    { name_attr?, objtype_attr?, string } # FIXME: add objprefval
 | 
| 17735 |    985 | 
 | 
| 23434 |    986 | doitem        = element doitem        { string } 
 | 
|  |    987 | undoitem      = element undoitem      { name_attr?, objtype_attr?, times_attr? } 
 | 
|  |    988 | redoitem      = element redoitem      { name_attr?, objtype_attr?, times_attr? } 
 | 
| 17735 |    989 | aborttheory   = element aborttheory   { empty }
 | 
|  |    990 | retracttheory = element retracttheory { thyname_attr }
 | 
|  |    991 | 
 | 
|  |    992 | parentnames_attr = attribute parentnames { objnames }
 | 
|  |    993 | 
 | 
|  |    994 | 
 | 
|  |    995 | # Below, url_attr will often be a file URL.  We assume for now that
 | 
|  |    996 | # the prover and interface are running on same filesystem.
 | 
|  |    997 | #
 | 
|  |    998 | 
 | 
|  |    999 | openfile      = element openfile  { url_attr }	    # notify begin reading from given file
 | 
|  |   1000 | closefile     = element closefile { empty }	    # notify currently open file is complete
 | 
|  |   1001 | abortfile     = element abortfile { empty }	    # notify currently open file is discarded
 | 
|  |   1002 | loadfile      = element loadfile  { url_attr }	    # ask prover to read file directly
 | 
| 23434 |   1003 | retractfile   = element retractfile { url_attr }    # ask prover to retract file
 | 
|  |   1004 | changecwd     = element changecwd { url_attr }	    # ask prover to change current working dir
 | 
| 17735 |   1005 | 
 | 
|  |   1006 | # this one not yet implemented, but would be handy.  Perhaps could be 
 | 
|  |   1007 | # locatethy/locatefile instead.
 | 
|  |   1008 | #locateobj     = element locateobj { name_attr, objtype_attr } # ask prover for file defining obj
 | 
|  |   1009 | 
 | 
| 23434 |   1010 | informfileloaded    = element informfileloaded    { completed_attr?, 
 | 
|  |   1011 | 						    url_attr }  # prover indicates a processed file
 | 
|  |   1012 | informfileretracted = element informfileretracted { completed_attr?, 
 | 
|  |   1013 | 						    url_attr }  # prover indicates an undone file
 | 
|  |   1014 | informfileoutdated = element informfileoutdated { completed_attr?, 
 | 
|  |   1015 | 						    url_attr }  # prover indicates an outdated file
 | 
|  |   1016 | 
 | 
| 17735 |   1017 | informfilelocation  = element informfilelocation  { url_attr }  # response to locateobj
 | 
|  |   1018 | 
 | 
| 23434 |   1019 | completed_attr = attribute completed { xsd:boolean }  # false if not completed (absent=>true)
 | 
|  |   1020 | 						      # (the prover is requesting a lock)
 | 
|  |   1021 | 
 | 
|  |   1022 | 
 | 
|  |   1023 | 
 | 
| 17735 |   1024 | informguise = 
 | 
|  |   1025 |    element informguise {
 | 
|  |   1026 |       element guisefile { url_attr }?,
 | 
|  |   1027 |       element guisetheory { thyname_attr }?,
 | 
|  |   1028 |       element guiseproof { thmname_attr?, proofpos_attr? }?
 | 
|  |   1029 |    }
 | 
|  |   1030 | 
 | 
|  |   1031 | proofpos_attr = attribute proofpos { xsd:nonNegativeInteger }
 | 
|  |   1032 | 
 | 
| 23434 |   1033 | systemcmd     = element systemcmd     { string }	# "shell escape", arbitrary prover command!
 | 
| 17735 |   1034 | 
 | 
|  |   1035 | # ==============================================================================
 | 
| 23434 |   1036 | # 8. Internal messages: only used between communicating brokers.
 | 
| 17735 |   1037 | # ==============================================================================
 | 
|  |   1038 | internalmsg  = launchcomp | stopcomp | registercomp | compstatus
 | 
|  |   1039 | 
 | 
|  |   1040 | launchcomp   = element launchcomponent { componentspec }
 | 
|  |   1041 | 	               # request to start an instance of this component remotely
 | 
| 23434 |   1042 | stopcomp     = element stopcomponent { attribute sessionid { token } }
 | 
| 17735 |   1043 |                        # request to stop component with this session id remotely
 | 
|  |   1044 | 
 | 
|  |   1045 | registercomp = element registercomponent { activecompspec } 
 | 
|  |   1046 |                        # component has been started successfully
 | 
|  |   1047 | compstatus   = element componentstatus { componentstatus_attr    # status
 | 
|  |   1048 | 	                               , componentid_attr?       # component id (for failure)
 | 
| 23434 |   1049 | 	                               , element text { string }?  # user-visible error message
 | 
|  |   1050 | 				       , element info { string }?  # Additional info for log files.
 | 
| 17735 |   1051 | 				       }	
 | 
|  |   1052 |                        # component status: failed to start, or exited
 | 
|  |   1053 | 
 | 
|  |   1054 | componentstatus_attr = attribute status { ("fail"   # component failed to start
 | 
|  |   1055 |  		                          |"exit"  # component exited
 | 
|  |   1056 | 					  )}	
 | 
|  |   1057 | 
 | 
|  |   1058 | # Local variables:
 | 
|  |   1059 | # fill-column: 95
 | 
|  |   1060 | # End:
 | 
|  |   1061 | # ==============================================================================
 | 
|  |   1062 | # end of `pgip.rnc'.
 | 
|  |   1063 | 
 |