Esempio n. 1
0
    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>
''')
Esempio n. 2
0
 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
Esempio n. 3
0
 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
Esempio n. 4
0
    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>
''')
Esempio n. 5
0
 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
Esempio n. 6
0
 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