def get(self, arg): o = self.response.out style = self.request.get('style', 'interleaved') url = '/' + arg formatter = ProofFormatter(o, style, url) stylesheet = '<link rel=stylesheet href="/static/showthm.css" type="text/css">\n' common.header(o, 'List of theorems', stylesheet) o.write('<p>List of theorems in ' + cgi.escape(arg) + ':</p>\n') urlctx = read.UrlCtx(url) runner = ListThmsRunner() # We use the standard runner for imports and exports, but our own # special one for the topmost context. ctx = verify.VerifyCtx(urlctx, verify.run, runner.error_handler) try: runner.run(urlctx, url, ctx, DevNull()) except NotFound: self.error(404) self.response.out.write(url + ' not found') return logging.debug(`runner.thmlist`) for error, thm_name, hypotheses, conclusion, lines in runner.thmlist: header = get_header_from_description(lines) if header is not None: formatter.write_header(header) lines = trim_description(lines) description = [] for i in range(len(lines)): line = lines[i].strip() if line.startswith('#'): description.append(line[1:].lstrip()) elif len(line) != 0: break descstr = ' '.join(description) thmurl = urllib.quote(url + '/' + thm_name) errstr = '' o.write('<div class="listthm">') if error: errstr = '<a href="/edit' + thmurl + '" class="error_indicator">●</a> ' o.write('<div class="listthmline" ">%s<a href="%s">%s</a> %s</div>\n' % \ (errstr, thmurl, cgi.escape(thm_name), cgi.escape(descstr))) if len(hypotheses) > 0: prefix = '' for hypothesis in hypotheses[1::2]: o.write(prefix) o.write('<span class="sexp">%s</span>\n' % cgi.escape(verify.sexp_to_string(hypothesis))) prefix = ', ' o.write(' ⊢ ') o.write('<span class="sexp">%s</span>\n' % cgi.escape(verify.sexp_to_string(conclusion))) o.write('</div>') o.write( '''<script src="/js/verify.js" type="text/javascript"></script> <script src="/js/showthm.js" type="text/javascript"></script> <script src="/js/typeset.js" type="text/javascript"></script> <script type="text/javascript"> GH.typeset_intermediates() </script> ''')
def notify_newline(self): self.output_accum() self.formatter.proof_newline() if self.tos_fresh: tos_str = verify.sexp_to_string(self.proofctx.stack[-1]) if self.style == 'interleaved': self.formatter.write_intermediate_line(tos_str, len(self.proofctx.stack)) self.tos_fresh = False
def notify_newline(self): self.output_accum() self.formatter.proof_newline() if self.tos_fresh: tos_str = verify.sexp_to_string(self.proofctx.stack[-1]) if self.style == 'interleaved': self.formatter.write_intermediate_line( tos_str, len(self.proofctx.stack)) self.tos_fresh = False
def get(self, arg): o = self.response.out style = self.request.get('style', 'interleaved') url = '/' + arg formatter = ProofFormatter(o, style, url) stylesheet = '<link rel=stylesheet href="/static/showthm.css" type="text/css">\n' common.header(o, 'List of theorems', stylesheet) o.write('<div class="list-section">') o.write('<p>List of theorems in ' + cgi.escape(arg) + ':</p>\n') urlctx = read.UrlCtx(url) runner = ListThmsRunner() # We use the standard runner for imports and exports, but our own # special one for the topmost context. ctx = verify.VerifyCtx(urlctx, verify.run, runner.error_handler) try: runner.run(urlctx, url, ctx, DevNull()) except NotFound: self.error(404) self.response.out.write(url + ' not found') return logging.debug( ` runner.thmlist `) for error, thm_name, hypotheses, conclusion, lines in runner.thmlist: header = get_header_from_description(lines) if header is not None: formatter.write_header(header) lines = trim_description(lines) description = [] for i in range(len(lines)): line = lines[i].strip() if line.startswith('#'): description.append(line[1:].lstrip()) elif len(line) != 0: break descstr = ' '.join(description) thmurl = urllib.quote(url + '/' + thm_name) errstr = '' o.write( '<div class="listthm" onclick="window.location=\'/edit%s\'">' % (thmurl)) if error: errstr = '<a href="/edit' + thmurl + '" class="error_indicator">●</a> ' o.write('<div class="listthmline" ">%s<a href="%s">%s</a> %s</div>\n' % \ (errstr, thmurl, cgi.escape(thm_name), cgi.escape(descstr))) if len(hypotheses) > 0: prefix = '' for hypothesis in hypotheses[1::2]: o.write(prefix) o.write('<span class="sexp">%s</span>\n' % cgi.escape(verify.sexp_to_string(hypothesis))) prefix = ', ' o.write(' ⊢ ') o.write('<span class="sexp">%s</span>\n' % cgi.escape(verify.sexp_to_string(conclusion))) o.write('</div>') o.write('''<script src="/js/verify.js" type="text/javascript"></script> <script src="/js/showthm.js" type="text/javascript"></script> <script src="/js/typeset.js" type="text/javascript"></script> <script src="/js/prover/numUtil.js" type="text/javascript"></script> <script type="text/javascript"> GH.typeset_intermediates() </script> </div> ''')
def run(self, verifyctx): trace = [] state = 3 if self.cmd == 'thm' else 12 # to match the state numbers in direct.js sexpstack = [] concl = None while True: tok = self.s.get_tok() if tok is None: return 'unexpected eof' thestep = None #self.out.write('tok: ' + tok + ' ' + str(state) + '\n') if state == 3: if tok == '(': sexpstack.append([]) state = 5 else: return 'expected dv list' elif state == 4: if tok == '(': sexpstack.append([]) state = 7 else: return 'expected hyp list' elif state == 6: if tok == '(': sexpstack.append([]) state = 9 elif tok == ')': return 'expected proof stmt' else: thestep = tok state = 8 elif state == 8: if tok == '(': sexpstack.append([]) state = 9 elif tok == ')': state = 10 else: thestep = tok elif state in (5, 7, 9): if tok == '(': sexpstack.append([]) elif tok == ')': if len(sexpstack) == 1: thestep = sexpstack.pop() state -= 1 else: last = sexpstack.pop() sexpstack[-1].append(last) else: sexpstack[-1].append(tok) elif state == 12: # kind of term being defined (defthm only) if tok in ('(', ')'): return 'expected defined kind' state = 13 elif state == 13: # beginning of definiendum (defthm only) if tok == '(': state = 14 else: return 'expected definiendum' elif state == 14: # body of definiendum (defthm only) if tok == ')': state = 3 elif tok == '(': return 'did not expect nested s-exp in definiendum' if state == 4: #self.out.write('dv list: ' + verify.sexp_to_string(thestep) + '\n') label = None # doesn't seem to be needed fvmap = {} # won't check these varmap = {} varlist = [] proofctx = verify.ProofCtx(label, fvmap) proofctx.varmap = varmap proofctx.varlist = varlist self.proofctx = proofctx elif state == 6: #self.out.write('hyps: ' + verify.sexp_to_string(thestep) + '\n') hypmap = {} for i in range(0, len(thestep), 2): hypmap[thestep[i]] = thestep[i + 1] pass elif state == 8 and concl is None: #self.out.write('concl: ' + verify.sexp_to_string(thestep) + '\n') concl = thestep elif state == 8: #self.out.write('step: ' + verify.sexp_to_string(thestep) + '\n') stack_len_before = len(proofctx.stack) verifyctx.check_proof_step(hypmap, thestep, proofctx) if len(proofctx.mandstack) == 0: if self.style == 'step': n_popped = stack_len_before - len(proofctx.stack) + 1 step_string = verify.sexp_to_string(proofctx.stack[-1]) trace.append([n_popped, step_string]) self.accum.pop() self.output_accum() is_linkable = thestep in self.linkable_thms self.formatter.write_proof_step(thestep, is_linkable) self.tos_fresh = True #self.out.write('proofctx stack len = %d\n' % len(proofctx.stack)) elif state == 10: self.notify_newline() self.formatter.done() if self.style == 'step': self.formatter.write_trace(trace) break