Skip to content

Commit 317cb11

Browse files
committed
Show proof status on the left bar: complete, complete with Z3, incomplete, unprovable
1 parent 33548d0 commit 317cb11

3 files changed

Lines changed: 67 additions & 2 deletions

File tree

index.html

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -116,9 +116,12 @@
116116
border-bottom: 1px solid white;
117117
padding: 1em 0.2em 1em 0.2em;
118118
}
119-
#left-bar ol li span {
119+
#left-bar ol li span.conclusion {
120120
cursor: pointer;
121121
}
122+
span.resultOk { color: #4cd625; }
123+
span.resultBad { color: #dc3545; }
124+
span.resultIncomplete { color: #FFA500; }
122125
.selected {
123126
background: #0d6efd;
124127
}

src/app.js

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -182,14 +182,27 @@ const refreshList = () => {
182182
let ol = document.querySelector('#left-bar ol')
183183
ol.innerHTML = ''
184184
proofs.forEach((entry, i) => {
185+
let status = entry.proof.status()
186+
let result = ``
187+
if (status instanceof Unprovable) {
188+
result = `<span class="resultBad">✖</span>`
189+
} else if (status instanceof Incomplete) {
190+
result = `<span class="resultIncomplete">✎</span>`
191+
} else if (status instanceof CompleteWithZ3) {
192+
result = `<span class="resultOk">✓*</span>`
193+
} else if (status instanceof Complete) {
194+
result = `<span class="resultOk">✓</span>`
195+
}
196+
185197
ol.innerHTML += `<li value="${i}" class="${entry.selected ? 'selected' : ''}">
186-
<span onclick="javascript:selectProof(${i})">
198+
<span class="conclusion" onclick="javascript:selectProof(${i})">
187199
${entry.proof.conclusion.unicode()}
188200
</span>
189201
<br>
190202
<button onclick="javascript:giveLatex(${i})" class="latex">L<sup>a</sup>T<sub>e</sub>X</button>
191203
<button onclick="javascript:removeProof(${i})">✖ Delete</button>
192204
<button onclick="javascript:saveProof(${i})">💾 Save</button>
205+
${result}
193206
</li>`
194207
})
195208
}

src/schema.js

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,12 @@ const deepEqual = (x, y) => {
1818
// Check if argument (arr) is array of objects type (cl)
1919
const arrayOf = (arr, cl) => arr instanceof Array && arr.every(a => a instanceof cl)
2020

21+
class Status { }
22+
class Complete extends Status { }
23+
class CompleteWithZ3 extends Status { }
24+
class Incomplete extends Status { }
25+
class Unprovable extends Status { }
26+
2127
class Term {
2228
constructor () {
2329
if (new.target === Term) {
@@ -548,6 +554,14 @@ ${rule}
548554
throw new TypeError(`Don't know how to typeset a judgment with ${this.premises.length} premises`)
549555
}
550556
}
557+
558+
status () {
559+
let prems = this.premises.map(p => p.status())
560+
if(prems.some(s => s instanceof Unprovable)) { return new Unprovable() }
561+
if(prems.some(s => s instanceof Incomplete)) { return new Incomplete() }
562+
if(prems.some(s => s instanceof CompleteWithZ3)) { return new CompleteWithZ3() }
563+
return new Complete()
564+
}
551565
}
552566

553567
// Beginning of LK rules
@@ -1189,13 +1203,24 @@ class Z3Rule extends LKProofTree {
11891203
canvas.remove(obj)
11901204
})
11911205
proofs.map(p => p.proof.draw())
1206+
refreshList()
11921207

11931208
})
11941209
}
11951210

11961211
reconstructor () {
11971212
return `new Z3Rule(${this.conclusion.reconstructor()})`
11981213
}
1214+
1215+
status () {
1216+
if (this.z3Response === true) {
1217+
return new CompleteWithZ3()
1218+
} else if (this.z3Response === false) {
1219+
return new Unprovable()
1220+
} else {
1221+
return new Incomplete()
1222+
}
1223+
}
11991224
}
12001225

12011226
class LKIncomplete extends LKProofTree {
@@ -1224,6 +1249,14 @@ class LKIncomplete extends LKProofTree {
12241249
return `new LKIncomplete(${this.conclusion.reconstructor()})`
12251250
}
12261251
}
1252+
1253+
status () {
1254+
if (this.completer) {
1255+
return this.completer.status()
1256+
} else {
1257+
return new Incomplete()
1258+
}
1259+
}
12271260
}
12281261

12291262
// End of LK rules
@@ -1577,6 +1610,14 @@ ${rule}
15771610
throw new TypeError(`Don't know how to typeset a judgment with ${this.premises.length} premises`)
15781611
}
15791612
}
1613+
1614+
status () {
1615+
let prems = this.premises.map(p => p.status())
1616+
if(prems.some(s => s instanceof Unprovable)) { return new Unprovable() }
1617+
if(prems.some(s => s instanceof Incomplete)) { return new Incomplete() }
1618+
if(prems.some(s => s instanceof CompleteWithZ3)) { return new CompleteWithZ3() }
1619+
return new Complete()
1620+
}
15801621
}
15811622

15821623
/*
@@ -1805,6 +1846,14 @@ class HoareIncomplete extends HoareProofTree {
18051846
return `new HoareIncomplete(${this.conclusion.reconstructor()})`
18061847
}
18071848
}
1849+
1850+
status () {
1851+
if (this.completer) {
1852+
return this.completer.status()
1853+
} else {
1854+
return new Incomplete()
1855+
}
1856+
}
18081857
}
18091858

18101859
// If a tree is set as toDelete, delete the tree and its premises

0 commit comments

Comments
 (0)