Skip to content

Commit dc0c200

Browse files
committed
added doctest
1 parent 9470a48 commit dc0c200

File tree

6 files changed

+95
-86
lines changed

6 files changed

+95
-86
lines changed

kdrag/contrib/prolog/__init__.py

Lines changed: 78 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,79 @@
1+
import kdrag.smt as smt
12
import lark
3+
4+
grammar = r"""
5+
start: _statement*
6+
7+
_statement: fact
8+
| rule
9+
| query
10+
11+
fact: predicate "."
12+
rule: predicate ":-" predicate_list "."
13+
query: "?-" predicate_list "."
14+
15+
predicate_list: predicate ("," predicate)* // inlined
16+
17+
predicate: IDENTIFIER "(" term_list? ")"
18+
term_list: term ("," term)* // inlined
19+
20+
term: IDENTIFIER -> const // constants or functors
21+
| VARIABLE -> var // variables
22+
| IDENTIFIER "(" term_list ")" -> fun_app // recursive terms (e.g., s(X))
23+
24+
VARIABLE: /[A-Z][A-Za-z0-9_]*/ // Variables start with uppercase
25+
IDENTIFIER: /[a-z][A-Za-z0-9_]*/ // Constants and function names start with lowercase
26+
27+
%import common.WS
28+
%ignore WS
29+
"""
30+
31+
Term = smt.DeclareSort("Term")
32+
33+
34+
def interp_term(t):
35+
token = t.data
36+
if token == "const":
37+
return smt.Const(t.children[0], Term)
38+
elif token == "var":
39+
return smt.Const(t.children[0], Term)
40+
elif token == "fun_app":
41+
args = t.children[1].children
42+
sortlist = [Term] * (len(args) + 1)
43+
f = smt.Function(t.children[0], *sortlist)
44+
return f(*[interp_term(a) for a in args])
45+
else:
46+
raise ValueError(f"Unexpected term {t}")
47+
48+
49+
def interp_pred(t):
50+
assert t.data == "predicate"
51+
name = t.children[0]
52+
args = [interp_term(a) for a in t.children[1].children]
53+
return smt.Function(name, *([Term] * len(args)), smt.BoolSort())(*args)
54+
55+
56+
def interp(t):
57+
assert t.data == "start"
58+
clauses = []
59+
for stmt in t.children:
60+
if stmt.data == "fact":
61+
clauses.append(interp_pred(stmt.children[0]))
62+
elif stmt.data == "rule":
63+
head = interp_pred(stmt.children[0])
64+
predlist = stmt.children[1]
65+
66+
assert predlist.data == "predicate_list"
67+
body = [
68+
interp_pred(p) for p in [stmt.children[0]] + stmt.children[1].children
69+
]
70+
clauses.append(smt.Implies(smt.And(*body), head))
71+
elif stmt.data == "query":
72+
q = [interp_pred(p) for p in stmt.children[0].children]
73+
print("query", q)
74+
else:
75+
raise ValueError(f"Unexpected statement {stmt}")
76+
return clauses
77+
78+
79+
parser = lark.Lark(grammar, start="start", parser="lalr")

kdrag/kernel.py

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -59,10 +59,10 @@ def lemma(
5959
Returns:
6060
Proof: A proof object of thm
6161
62-
>>> lemma(BoolVal(True))
63-
64-
>>> lemma(RealVal(1) >= RealVal(0))
65-
62+
>>> lemma(smt.BoolVal(True))
63+
|- True
64+
>>> lemma(smt.RealVal(1) >= smt.RealVal(0))
65+
|- 1 >= 0
6666
"""
6767
if admit:
6868
logger.warning("Admitting lemma {}".format(thm))

kdrag/parsers/prolog.py

Lines changed: 0 additions & 79 deletions
This file was deleted.

kdrag/tactics.py

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -132,9 +132,11 @@ def lemma(
132132
Returns:
133133
Proof: A proof object of thm
134134
135-
>>> lemma(BoolVal(True))
135+
>>> lemma(smt.BoolVal(True))
136+
|- True
136137
137-
>>> lemma(RealVal(1) >= RealVal(0))
138+
>>> lemma(smt.RealVal(1) >= smt.RealVal(0))
139+
|- 1 >= 0
138140
139141
"""
140142
if kd.kernel.is_proof(by):
@@ -394,6 +396,9 @@ def exists(self, *ts):
394396
"""
395397
Give terms `ts` to satisfy an exists goal
396398
`?|- exists x, p(x)` becomes `?|- p(ts)`
399+
>>> x,y = smt.Ints("x y")
400+
>>> Lemma(smt.Exists([x], x == y)).exists(y)
401+
[] ?|- y == y
397402
"""
398403
ctx, goal = self.goals[-1]
399404
lemma = kd.kernel.forget2(ts, goal)

pytest.ini

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
[pytest]
2+
# Exclude specific directories
3+
norecursedirs = kdrag/solvers/eprover kdrag/solvers/gappa* kdrag/solvers/Prover9
4+
5+
addopts = --doctest-modules

tests/test_parsers.py

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import kdrag.parsers as parsers
2-
import kdrag.parsers.prolog as prolog
2+
import kdrag.contrib.prolog as prolog
33
import kdrag.parsers.tptp as tptp
44
import kdrag.parsers.smtlib as smtlib
55
import lark

0 commit comments

Comments
 (0)