proofery 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (47) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +247 -0
  3. package/dist/block.d.ts +19 -0
  4. package/dist/block.d.ts.map +1 -0
  5. package/dist/block.js +24 -0
  6. package/dist/block.js.map +1 -0
  7. package/dist/calculateVerifier.d.ts +10 -0
  8. package/dist/calculateVerifier.d.ts.map +1 -0
  9. package/dist/calculateVerifier.js +184 -0
  10. package/dist/calculateVerifier.js.map +1 -0
  11. package/dist/cli.d.ts +6 -0
  12. package/dist/cli.d.ts.map +1 -0
  13. package/dist/cli.js +94 -0
  14. package/dist/cli.js.map +1 -0
  15. package/dist/context.d.ts +33 -0
  16. package/dist/context.d.ts.map +1 -0
  17. package/dist/context.js +50 -0
  18. package/dist/context.js.map +1 -0
  19. package/dist/errors.d.ts +10 -0
  20. package/dist/errors.d.ts.map +1 -0
  21. package/dist/errors.js +16 -0
  22. package/dist/errors.js.map +1 -0
  23. package/dist/expression.d.ts +32 -0
  24. package/dist/expression.d.ts.map +1 -0
  25. package/dist/expression.js +123 -0
  26. package/dist/expression.js.map +1 -0
  27. package/dist/index.d.ts +26 -0
  28. package/dist/index.d.ts.map +1 -0
  29. package/dist/index.js +32 -0
  30. package/dist/index.js.map +1 -0
  31. package/dist/nodeParser.d.ts +16 -0
  32. package/dist/nodeParser.d.ts.map +1 -0
  33. package/dist/nodeParser.js +23 -0
  34. package/dist/nodeParser.js.map +1 -0
  35. package/dist/parser.d.ts +10 -0
  36. package/dist/parser.d.ts.map +1 -0
  37. package/dist/parser.js +161 -0
  38. package/dist/parser.js.map +1 -0
  39. package/dist/simplifier.d.ts +10 -0
  40. package/dist/simplifier.d.ts.map +1 -0
  41. package/dist/simplifier.js +52 -0
  42. package/dist/simplifier.js.map +1 -0
  43. package/dist/verifier.d.ts +9 -0
  44. package/dist/verifier.d.ts.map +1 -0
  45. package/dist/verifier.js +547 -0
  46. package/dist/verifier.js.map +1 -0
  47. package/package.json +48 -0
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.d.ts","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAE7C;;GAEG;AACH,qBAAa,OAAO;IAChB,OAAO,CAAC,SAAS,CAA0B;IACpC,IAAI,EAAE,UAAU,GAAG,IAAI,CAAC;;IAO/B;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,UAAU,GAAG,IAAI;IAIpD;;OAEG;IACH,WAAW,CAAC,IAAI,EAAE,MAAM,GAAG,OAAO;IAIlC;;OAEG;IACH,eAAe,CAAC,IAAI,EAAE,MAAM,GAAG,UAAU,GAAG,SAAS;IAIrD;;OAEG;IACH,IAAI,IAAI,OAAO;IAOf;;OAEG;IACH,QAAQ,IAAI,MAAM;CAOrB"}
@@ -0,0 +1,50 @@
1
+ /**
2
+ * Context tracking for proof verification.
3
+ */
4
+ /**
5
+ * Context holds variables and their types, plus the current goal.
6
+ */
7
+ export class Context {
8
+ constructor() {
9
+ this.variables = new Map();
10
+ this.goal = null;
11
+ }
12
+ /**
13
+ * Add a variable with its type to the context.
14
+ */
15
+ addVariable(name, varType) {
16
+ this.variables.set(name, varType);
17
+ }
18
+ /**
19
+ * Check if a variable exists in the context.
20
+ */
21
+ hasVariable(name) {
22
+ return this.variables.has(name);
23
+ }
24
+ /**
25
+ * Get the type of a variable.
26
+ */
27
+ getVariableType(name) {
28
+ return this.variables.get(name);
29
+ }
30
+ /**
31
+ * Create a deep copy of this context.
32
+ */
33
+ copy() {
34
+ const newContext = new Context();
35
+ newContext.variables = new Map(this.variables);
36
+ newContext.goal = this.goal ? this.goal.copy() : null;
37
+ return newContext;
38
+ }
39
+ /**
40
+ * String representation of the context.
41
+ */
42
+ toString() {
43
+ const vars = Array.from(this.variables.entries())
44
+ .map(([name, type]) => `${name}: ${type.toString()}`)
45
+ .join(', ');
46
+ const goalStr = this.goal ? this.goal.toString() : 'None';
47
+ return `Context(vars=[${vars}], goal=${goalStr})`;
48
+ }
49
+ }
50
+ //# sourceMappingURL=context.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"context.js","sourceRoot":"","sources":["../src/context.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,MAAM,OAAO,OAAO;IAIhB;QACI,IAAI,CAAC,SAAS,GAAG,IAAI,GAAG,EAAE,CAAC;QAC3B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IACrB,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,IAAY,EAAE,OAAmB;QACzC,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;IACtC,CAAC;IAED;;OAEG;IACH,WAAW,CAAC,IAAY;QACpB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,eAAe,CAAC,IAAY;QACxB,OAAO,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;IACpC,CAAC;IAED;;OAEG;IACH,IAAI;QACA,MAAM,UAAU,GAAG,IAAI,OAAO,EAAE,CAAC;QACjC,UAAU,CAAC,SAAS,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,SAAS,CAAC,CAAC;QAC/C,UAAU,CAAC,IAAI,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;QACtD,OAAO,UAAU,CAAC;IACtB,CAAC;IAED;;OAEG;IACH,QAAQ;QACJ,MAAM,IAAI,GAAG,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,SAAS,CAAC,OAAO,EAAE,CAAC;aAC5C,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,IAAI,CAAC,EAAE,EAAE,CAAC,GAAG,IAAI,KAAK,IAAI,CAAC,QAAQ,EAAE,EAAE,CAAC;aACpD,IAAI,CAAC,IAAI,CAAC,CAAC;QAChB,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,QAAQ,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC;QAC1D,OAAO,iBAAiB,IAAI,WAAW,OAAO,GAAG,CAAC;IACtD,CAAC;CACJ"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Custom error classes for proofery.
3
+ */
4
+ export declare class VerificationError extends Error {
5
+ constructor(message: string);
6
+ }
7
+ export declare class ParseError extends SyntaxError {
8
+ constructor(message: string);
9
+ }
10
+ //# sourceMappingURL=errors.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,qBAAa,iBAAkB,SAAQ,KAAK;gBAC5B,OAAO,EAAE,MAAM;CAI9B;AAED,qBAAa,UAAW,SAAQ,WAAW;gBAC3B,OAAO,EAAE,MAAM;CAI9B"}
package/dist/errors.js ADDED
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Custom error classes for proofery.
3
+ */
4
+ export class VerificationError extends Error {
5
+ constructor(message) {
6
+ super(message);
7
+ this.name = 'VerificationError';
8
+ }
9
+ }
10
+ export class ParseError extends SyntaxError {
11
+ constructor(message) {
12
+ super(message);
13
+ this.name = 'ParseError';
14
+ }
15
+ }
16
+ //# sourceMappingURL=errors.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,MAAM,OAAO,iBAAkB,SAAQ,KAAK;IACxC,YAAY,OAAe;QACvB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,mBAAmB,CAAC;IACpC,CAAC;CACJ;AAED,MAAM,OAAO,UAAW,SAAQ,WAAW;IACvC,YAAY,OAAe;QACvB,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;IAC7B,CAAC;CACJ"}
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Expression tree representation and parsing.
3
+ */
4
+ /**
5
+ * Represents a prefix-notation expression tree.
6
+ */
7
+ export declare class Expression {
8
+ readonly name: string;
9
+ readonly children: Expression[];
10
+ constructor(name: string, children?: Expression[]);
11
+ /**
12
+ * Check structural equality of expressions.
13
+ */
14
+ equals(other: Expression): boolean;
15
+ /**
16
+ * Create a deep copy of this expression.
17
+ */
18
+ copy(): Expression;
19
+ /**
20
+ * Substitute all occurrences of varName with replacement.
21
+ */
22
+ substitute(varName: string, replacement: Expression): Expression;
23
+ /**
24
+ * String representation of the expression.
25
+ */
26
+ toString(): string;
27
+ }
28
+ /**
29
+ * Parse a prefix notation expression, handling 'a : b' as var(a, b).
30
+ */
31
+ export declare function parseExpression(text: string, lineNum: number): Expression;
32
+ //# sourceMappingURL=expression.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expression.d.ts","sourceRoot":"","sources":["../src/expression.ts"],"names":[],"mappings":"AAAA;;GAEG;AAIH;;GAEG;AACH,qBAAa,UAAU;aAEC,IAAI,EAAE,MAAM;aACZ,QAAQ,EAAE,UAAU,EAAE;gBADtB,IAAI,EAAE,MAAM,EACZ,QAAQ,GAAE,UAAU,EAAO;IAG/C;;OAEG;IACH,MAAM,CAAC,KAAK,EAAE,UAAU,GAAG,OAAO;IAUlC;;OAEG;IACH,IAAI,IAAI,UAAU;IAOlB;;OAEG;IACH,UAAU,CAAC,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,UAAU,GAAG,UAAU;IAUhE;;OAEG;IACH,QAAQ,IAAI,MAAM;CAOrB;AAED;;GAEG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,UAAU,CA2EzE"}
@@ -0,0 +1,123 @@
1
+ /**
2
+ * Expression tree representation and parsing.
3
+ */
4
+ import { ParseError } from './errors.js';
5
+ /**
6
+ * Represents a prefix-notation expression tree.
7
+ */
8
+ export class Expression {
9
+ constructor(name, children = []) {
10
+ this.name = name;
11
+ this.children = children;
12
+ }
13
+ /**
14
+ * Check structural equality of expressions.
15
+ */
16
+ equals(other) {
17
+ if (this.name !== other.name) {
18
+ return false;
19
+ }
20
+ if (this.children.length !== other.children.length) {
21
+ return false;
22
+ }
23
+ return this.children.every((child, i) => child.equals(other.children[i]));
24
+ }
25
+ /**
26
+ * Create a deep copy of this expression.
27
+ */
28
+ copy() {
29
+ return new Expression(this.name, this.children.map(c => c.copy()));
30
+ }
31
+ /**
32
+ * Substitute all occurrences of varName with replacement.
33
+ */
34
+ substitute(varName, replacement) {
35
+ if (this.name === varName && this.children.length === 0) {
36
+ return replacement.copy();
37
+ }
38
+ return new Expression(this.name, this.children.map(c => c.substitute(varName, replacement)));
39
+ }
40
+ /**
41
+ * String representation of the expression.
42
+ */
43
+ toString() {
44
+ if (this.children.length === 0) {
45
+ return this.name;
46
+ }
47
+ const childrenStr = this.children.map(c => c.toString()).join(', ');
48
+ return `${this.name}(${childrenStr})`;
49
+ }
50
+ }
51
+ /**
52
+ * Parse a prefix notation expression, handling 'a : b' as var(a, b).
53
+ */
54
+ export function parseExpression(text, lineNum) {
55
+ text = text.trim();
56
+ // Handle special case: "a : b" -> "var(a, b)"
57
+ if (text.includes(':')) {
58
+ // Find the colon that's not inside parentheses
59
+ let depth = 0;
60
+ let colonPos = -1;
61
+ for (let i = 0; i < text.length; i++) {
62
+ const ch = text[i];
63
+ if (ch === '(') {
64
+ depth++;
65
+ }
66
+ else if (ch === ')') {
67
+ depth--;
68
+ }
69
+ else if (ch === ':' && depth === 0) {
70
+ colonPos = i;
71
+ break;
72
+ }
73
+ }
74
+ if (colonPos > 0) {
75
+ const varName = text.substring(0, colonPos).trim();
76
+ const varType = text.substring(colonPos + 1).trim();
77
+ // Recursively parse to handle nested colons
78
+ const typeExpr = parseExpression(varType, lineNum);
79
+ return new Expression('var', [new Expression(varName), typeExpr]);
80
+ }
81
+ }
82
+ // Find the opening parenthesis
83
+ const parenPos = text.indexOf('(');
84
+ if (parenPos === -1) {
85
+ // Simple identifier with no children
86
+ return new Expression(text);
87
+ }
88
+ // Extract name and arguments
89
+ const exprName = text.substring(0, parenPos).trim();
90
+ // Find matching closing parenthesis
91
+ if (!text.endsWith(')')) {
92
+ throw new ParseError(`Line ${lineNum}: Mismatched parentheses in expression: ${text}`);
93
+ }
94
+ const argsText = text.substring(parenPos + 1, text.length - 1).trim();
95
+ // Parse comma-separated arguments (respecting nested parentheses)
96
+ const args = [];
97
+ if (argsText) {
98
+ let currentArg = '';
99
+ let depth = 0;
100
+ for (const ch of argsText) {
101
+ if (ch === ',' && depth === 0) {
102
+ args.push(currentArg.trim());
103
+ currentArg = '';
104
+ }
105
+ else {
106
+ if (ch === '(') {
107
+ depth++;
108
+ }
109
+ else if (ch === ')') {
110
+ depth--;
111
+ }
112
+ currentArg += ch;
113
+ }
114
+ }
115
+ if (currentArg) {
116
+ args.push(currentArg.trim());
117
+ }
118
+ }
119
+ // Recursively parse each argument
120
+ const children = args.map(arg => parseExpression(arg, lineNum));
121
+ return new Expression(exprName, children);
122
+ }
123
+ //# sourceMappingURL=expression.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"expression.js","sourceRoot":"","sources":["../src/expression.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEzC;;GAEG;AACH,MAAM,OAAO,UAAU;IACnB,YACoB,IAAY,EACZ,WAAyB,EAAE;QAD3B,SAAI,GAAJ,IAAI,CAAQ;QACZ,aAAQ,GAAR,QAAQ,CAAmB;IAC5C,CAAC;IAEJ;;OAEG;IACH,MAAM,CAAC,KAAiB;QACpB,IAAI,IAAI,CAAC,IAAI,KAAK,KAAK,CAAC,IAAI,EAAE,CAAC;YAC3B,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,KAAK,CAAC,QAAQ,CAAC,MAAM,EAAE,CAAC;YACjD,OAAO,KAAK,CAAC;QACjB,CAAC;QACD,OAAO,IAAI,CAAC,QAAQ,CAAC,KAAK,CAAC,CAAC,KAAK,EAAE,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,MAAM,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC,CAAC,CAAC;IAC9E,CAAC;IAED;;OAEG;IACH,IAAI;QACA,OAAO,IAAI,UAAU,CACjB,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC,CACnC,CAAC;IACN,CAAC;IAED;;OAEG;IACH,UAAU,CAAC,OAAe,EAAE,WAAuB;QAC/C,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtD,OAAO,WAAW,CAAC,IAAI,EAAE,CAAC;QAC9B,CAAC;QACD,OAAO,IAAI,UAAU,CACjB,IAAI,CAAC,IAAI,EACT,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,EAAE,WAAW,CAAC,CAAC,CAC7D,CAAC;IACN,CAAC;IAED;;OAEG;IACH,QAAQ;QACJ,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YAC7B,OAAO,IAAI,CAAC,IAAI,CAAC;QACrB,CAAC;QACD,MAAM,WAAW,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,QAAQ,EAAE,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;QACpE,OAAO,GAAG,IAAI,CAAC,IAAI,IAAI,WAAW,GAAG,CAAC;IAC1C,CAAC;CACJ;AAED;;GAEG;AACH,MAAM,UAAU,eAAe,CAAC,IAAY,EAAE,OAAe;IACzD,IAAI,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;IAEnB,8CAA8C;IAC9C,IAAI,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACrB,+CAA+C;QAC/C,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,IAAI,QAAQ,GAAG,CAAC,CAAC,CAAC;QAClB,KAAK,IAAI,CAAC,GAAG,CAAC,EAAE,CAAC,GAAG,IAAI,CAAC,MAAM,EAAE,CAAC,EAAE,EAAE,CAAC;YACnC,MAAM,EAAE,GAAG,IAAI,CAAC,CAAC,CAAC,CAAC;YACnB,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;gBACb,KAAK,EAAE,CAAC;YACZ,CAAC;iBAAM,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;gBACpB,KAAK,EAAE,CAAC;YACZ,CAAC;iBAAM,IAAI,EAAE,KAAK,GAAG,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;gBACnC,QAAQ,GAAG,CAAC,CAAC;gBACb,MAAM;YACV,CAAC;QACL,CAAC;QAED,IAAI,QAAQ,GAAG,CAAC,EAAE,CAAC;YACf,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;YACnD,MAAM,OAAO,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;YACpD,4CAA4C;YAC5C,MAAM,QAAQ,GAAG,eAAe,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;YACnD,OAAO,IAAI,UAAU,CAAC,KAAK,EAAE,CAAC,IAAI,UAAU,CAAC,OAAO,CAAC,EAAE,QAAQ,CAAC,CAAC,CAAC;QACtE,CAAC;IACL,CAAC;IAED,+BAA+B;IAC/B,MAAM,QAAQ,GAAG,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,CAAC;IAEnC,IAAI,QAAQ,KAAK,CAAC,CAAC,EAAE,CAAC;QAClB,qCAAqC;QACrC,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,CAAC;IAChC,CAAC;IAED,6BAA6B;IAC7B,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,CAAC,EAAE,QAAQ,CAAC,CAAC,IAAI,EAAE,CAAC;IAEpD,oCAAoC;IACpC,IAAI,CAAC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC;QACtB,MAAM,IAAI,UAAU,CAAC,QAAQ,OAAO,2CAA2C,IAAI,EAAE,CAAC,CAAC;IAC3F,CAAC;IAED,MAAM,QAAQ,GAAG,IAAI,CAAC,SAAS,CAAC,QAAQ,GAAG,CAAC,EAAE,IAAI,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC,IAAI,EAAE,CAAC;IAEtE,kEAAkE;IAClE,MAAM,IAAI,GAAa,EAAE,CAAC;IAC1B,IAAI,QAAQ,EAAE,CAAC;QACX,IAAI,UAAU,GAAG,EAAE,CAAC;QACpB,IAAI,KAAK,GAAG,CAAC,CAAC;QACd,KAAK,MAAM,EAAE,IAAI,QAAQ,EAAE,CAAC;YACxB,IAAI,EAAE,KAAK,GAAG,IAAI,KAAK,KAAK,CAAC,EAAE,CAAC;gBAC5B,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;gBAC7B,UAAU,GAAG,EAAE,CAAC;YACpB,CAAC;iBAAM,CAAC;gBACJ,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;oBACb,KAAK,EAAE,CAAC;gBACZ,CAAC;qBAAM,IAAI,EAAE,KAAK,GAAG,EAAE,CAAC;oBACpB,KAAK,EAAE,CAAC;gBACZ,CAAC;gBACD,UAAU,IAAI,EAAE,CAAC;YACrB,CAAC;QACL,CAAC;QAED,IAAI,UAAU,EAAE,CAAC;YACb,IAAI,CAAC,IAAI,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC;QACjC,CAAC;IACL,CAAC;IAED,kCAAkC;IAClC,MAAM,QAAQ,GAAG,IAAI,CAAC,GAAG,CAAC,GAAG,CAAC,EAAE,CAAC,eAAe,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC,CAAC;IAEhE,OAAO,IAAI,UAAU,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;AAC9C,CAAC"}
@@ -0,0 +1,26 @@
1
+ /**
2
+ * Proofery - A mathematical proof verifier
3
+ *
4
+ * This module provides the main library API for parsing and verifying
5
+ * mathematical proofs written in .prf format.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { parseContent, verifyFile } from 'proofery';
10
+ *
11
+ * const prfContent = `
12
+ * axiom my_axiom
13
+ * conclude eq(1, 1)
14
+ * `;
15
+ *
16
+ * const blocks = parseContent(prfContent);
17
+ * verifyFile(blocks, false);
18
+ * ```
19
+ */
20
+ export { parseContent } from './parser.js';
21
+ export { verifyFile } from './verifier.js';
22
+ export { Block } from './block.js';
23
+ export { Expression } from './expression.js';
24
+ export { Context } from './context.js';
25
+ export { VerificationError, ParseError } from './errors.js';
26
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAGH,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAM3C,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAG3C,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAGvC,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
package/dist/index.js ADDED
@@ -0,0 +1,32 @@
1
+ /**
2
+ * Proofery - A mathematical proof verifier
3
+ *
4
+ * This module provides the main library API for parsing and verifying
5
+ * mathematical proofs written in .prf format.
6
+ *
7
+ * @example
8
+ * ```typescript
9
+ * import { parseContent, verifyFile } from 'proofery';
10
+ *
11
+ * const prfContent = `
12
+ * axiom my_axiom
13
+ * conclude eq(1, 1)
14
+ * `;
15
+ *
16
+ * const blocks = parseContent(prfContent);
17
+ * verifyFile(blocks, false);
18
+ * ```
19
+ */
20
+ // Export parser functions (browser-safe)
21
+ export { parseContent } from './parser.js';
22
+ // Note: For Node.js file parsing (parseFile, parseFileSync),
23
+ // import directly from 'proofery/nodeParser' instead
24
+ // Export verifier functions
25
+ export { verifyFile } from './verifier.js';
26
+ // Export types
27
+ export { Block } from './block.js';
28
+ export { Expression } from './expression.js';
29
+ export { Context } from './context.js';
30
+ // Export error classes
31
+ export { VerificationError, ParseError } from './errors.js';
32
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;GAkBG;AAEH,yCAAyC;AACzC,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAE3C,8DAA8D;AAC9D,qDAAqD;AAErD,4BAA4B;AAC5B,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAE3C,eAAe;AACf,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AACnC,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC,uBAAuB;AACvB,OAAO,EAAE,iBAAiB,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC"}
@@ -0,0 +1,16 @@
1
+ /**
2
+ * Node.js-specific parser functions that use the fs module.
3
+ * These functions are not available in browser environments.
4
+ */
5
+ import type { Block } from './block.js';
6
+ /**
7
+ * Parse a .prf file from the filesystem and return a list of top-level blocks.
8
+ * This function is only available in Node.js environments.
9
+ */
10
+ export declare function parseFileSync(filepath: string): Block[];
11
+ /**
12
+ * Async version of parseFileSync.
13
+ * This function is only available in Node.js environments.
14
+ */
15
+ export declare function parseFile(filepath: string): Promise<Block[]>;
16
+ //# sourceMappingURL=nodeParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodeParser.d.ts","sourceRoot":"","sources":["../src/nodeParser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAExC;;;GAGG;AACH,wBAAgB,aAAa,CAAC,QAAQ,EAAE,MAAM,GAAG,KAAK,EAAE,CAGvD;AAED;;;GAGG;AACH,wBAAsB,SAAS,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,KAAK,EAAE,CAAC,CAGlE"}
@@ -0,0 +1,23 @@
1
+ /**
2
+ * Node.js-specific parser functions that use the fs module.
3
+ * These functions are not available in browser environments.
4
+ */
5
+ import * as fs from 'fs';
6
+ import { parseContent } from './parser.js';
7
+ /**
8
+ * Parse a .prf file from the filesystem and return a list of top-level blocks.
9
+ * This function is only available in Node.js environments.
10
+ */
11
+ export function parseFileSync(filepath) {
12
+ const content = fs.readFileSync(filepath, 'utf-8');
13
+ return parseContent(content);
14
+ }
15
+ /**
16
+ * Async version of parseFileSync.
17
+ * This function is only available in Node.js environments.
18
+ */
19
+ export async function parseFile(filepath) {
20
+ const content = fs.readFileSync(filepath, 'utf-8');
21
+ return parseContent(content);
22
+ }
23
+ //# sourceMappingURL=nodeParser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"nodeParser.js","sourceRoot":"","sources":["../src/nodeParser.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,IAAI,CAAC;AACzB,OAAO,EAAE,YAAY,EAAE,MAAM,aAAa,CAAC;AAG3C;;;GAGG;AACH,MAAM,UAAU,aAAa,CAAC,QAAgB;IAC1C,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnD,OAAO,YAAY,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC;AAED;;;GAGG;AACH,MAAM,CAAC,KAAK,UAAU,SAAS,CAAC,QAAgB;IAC5C,MAAM,OAAO,GAAG,EAAE,CAAC,YAAY,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;IACnD,OAAO,YAAY,CAAC,OAAO,CAAC,CAAC;AACjC,CAAC"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Parser for .prf files.
3
+ */
4
+ import { Block } from './block.js';
5
+ /**
6
+ * Parse .prf content and return a list of top-level blocks.
7
+ * This is the main parsing function that works in both browser and Node.js.
8
+ */
9
+ export declare function parseContent(content: string): Block[];
10
+ //# sourceMappingURL=parser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.d.ts","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAUnC;;;GAGG;AACH,wBAAgB,YAAY,CAAC,OAAO,EAAE,MAAM,GAAG,KAAK,EAAE,CA2CrD"}
package/dist/parser.js ADDED
@@ -0,0 +1,161 @@
1
+ /**
2
+ * Parser for .prf files.
3
+ */
4
+ import { Block } from './block.js';
5
+ import { Expression, parseExpression } from './expression.js';
6
+ import { ParseError } from './errors.js';
7
+ /**
8
+ * Parse .prf content and return a list of top-level blocks.
9
+ * This is the main parsing function that works in both browser and Node.js.
10
+ */
11
+ export function parseContent(content) {
12
+ const lines = content.split('\n');
13
+ // Parse lines with their indentation levels
14
+ const parsedLines = [];
15
+ let indentUnit = null;
16
+ for (let i = 0; i < lines.length; i++) {
17
+ const lineNum = i + 1;
18
+ let line = lines[i];
19
+ // Remove trailing newline/carriage return
20
+ line = line.replace(/\r?\n?$/, '');
21
+ // Skip empty lines and comments
22
+ if (!line.trim() || line.trim().startsWith('#')) {
23
+ continue;
24
+ }
25
+ // Detect indentation
26
+ let indentLevel = 0;
27
+ const stripped = line.trimStart();
28
+ const indentStr = line.substring(0, line.length - stripped.length);
29
+ if (indentStr) {
30
+ // Detect indent unit from first indented line
31
+ if (indentUnit === null) {
32
+ indentUnit = indentStr;
33
+ indentLevel = 1;
34
+ }
35
+ else {
36
+ // Check if indentation is consistent
37
+ if (indentStr.length % indentUnit.length !== 0) {
38
+ throw new ParseError(`Line ${lineNum}: Inconsistent indentation`);
39
+ }
40
+ indentLevel = indentStr.length / indentUnit.length;
41
+ }
42
+ }
43
+ parsedLines.push({ lineNum, level: indentLevel, text: stripped });
44
+ }
45
+ // Build block tree
46
+ return buildBlocks(parsedLines, 0, 0).blocks;
47
+ }
48
+ /**
49
+ * Recursively build block tree from parsed lines.
50
+ */
51
+ function buildBlocks(parsedLines, startIdx, expectedLevel) {
52
+ const blocks = [];
53
+ let idx = startIdx;
54
+ while (idx < parsedLines.length) {
55
+ const { lineNum, level, text } = parsedLines[idx];
56
+ // If we've gone back to a lower level, return to parent
57
+ if (level < expectedLevel) {
58
+ break;
59
+ }
60
+ // Skip lines at deeper levels (they'll be processed as children)
61
+ if (level > expectedLevel) {
62
+ throw new ParseError(`Line ${lineNum}: Unexpected indentation`);
63
+ }
64
+ // Parse the block
65
+ const block = parseBlock(lineNum, text);
66
+ // Process children at the next level
67
+ if (idx + 1 < parsedLines.length) {
68
+ const nextLevel = parsedLines[idx + 1].level;
69
+ if (nextLevel > level) {
70
+ const result = buildBlocks(parsedLines, idx + 1, level + 1);
71
+ block.children = result.blocks;
72
+ blocks.push(block);
73
+ idx = result.nextIdx;
74
+ continue;
75
+ }
76
+ }
77
+ blocks.push(block);
78
+ idx++;
79
+ }
80
+ return { blocks, nextIdx: idx };
81
+ }
82
+ /**
83
+ * Parse a single block line into a Block object.
84
+ */
85
+ function parseBlock(lineNum, lineText) {
86
+ // Split the line into tokens
87
+ const tokens = tokenize(lineText, lineNum);
88
+ if (tokens.length === 0) {
89
+ throw new ParseError(`Line ${lineNum}: Empty block`);
90
+ }
91
+ const blockType = tokens[0];
92
+ const remainingTokens = tokens.slice(1);
93
+ // Handle blocks with "name : type" pattern at the argument level
94
+ // For suppose, assert, define, we-have, case: expect 3 tokens (name, :, type)
95
+ let args;
96
+ if (['suppose', 'assert', 'define', 'we-have', 'case'].includes(blockType)) {
97
+ if (remainingTokens.length === 3 && remainingTokens[1] === ':') {
98
+ const varName = remainingTokens[0];
99
+ const varTypeText = remainingTokens[2];
100
+ const varType = parseExpression(varTypeText, lineNum);
101
+ args = [new Expression('var', [new Expression(varName), varType])];
102
+ }
103
+ else {
104
+ throw new ParseError(`Line ${lineNum}: '${blockType}' must have format 'name : type'`);
105
+ }
106
+ }
107
+ else {
108
+ // Parse the remaining tokens as expressions
109
+ args = remainingTokens.map(token => parseExpression(token, lineNum));
110
+ }
111
+ return new Block(lineNum, blockType, args);
112
+ }
113
+ /**
114
+ * Tokenize a line, respecting parentheses and colons.
115
+ */
116
+ function tokenize(line, lineNum) {
117
+ const tokens = [];
118
+ let currentToken = '';
119
+ let depth = 0;
120
+ for (const ch of line) {
121
+ if (ch === '(' && depth === 0) {
122
+ // Start of arguments
123
+ currentToken += ch;
124
+ depth++;
125
+ }
126
+ else if (ch === '(') {
127
+ currentToken += ch;
128
+ depth++;
129
+ }
130
+ else if (ch === ')') {
131
+ currentToken += ch;
132
+ depth--;
133
+ }
134
+ else if (ch === ':' && depth === 0) {
135
+ // Colon outside parentheses - token separator and also a token
136
+ if (currentToken.trim()) {
137
+ tokens.push(currentToken.trim());
138
+ currentToken = '';
139
+ }
140
+ tokens.push(':');
141
+ }
142
+ else if (ch === ' ' && depth === 0) {
143
+ // Space outside parentheses - token separator
144
+ if (currentToken.trim()) {
145
+ tokens.push(currentToken.trim());
146
+ currentToken = '';
147
+ }
148
+ }
149
+ else {
150
+ currentToken += ch;
151
+ }
152
+ }
153
+ if (currentToken.trim()) {
154
+ tokens.push(currentToken.trim());
155
+ }
156
+ if (depth !== 0) {
157
+ throw new ParseError(`Line ${lineNum}: Mismatched parentheses`);
158
+ }
159
+ return tokens.filter(t => t.length > 0);
160
+ }
161
+ //# sourceMappingURL=parser.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parser.js","sourceRoot":"","sources":["../src/parser.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ /**
2
+ * Expression simplification based on context.
3
+ */
4
+ import { Expression } from './expression.js';
5
+ import { Context } from './context.js';
6
+ /**
7
+ * Simplify an expression based on the context.
8
+ */
9
+ export declare function simplify(expr: Expression, context: Context): Expression;
10
+ //# sourceMappingURL=simplifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simplifier.d.ts","sourceRoot":"","sources":["../src/simplifier.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAC7C,OAAO,EAAE,OAAO,EAAE,MAAM,cAAc,CAAC;AAEvC;;GAEG;AACH,wBAAgB,QAAQ,CAAC,IAAI,EAAE,UAAU,EAAE,OAAO,EAAE,OAAO,GAAG,UAAU,CAWvE"}
@@ -0,0 +1,52 @@
1
+ /**
2
+ * Expression simplification based on context.
3
+ */
4
+ import { Expression } from './expression.js';
5
+ /**
6
+ * Simplify an expression based on the context.
7
+ */
8
+ export function simplify(expr, context) {
9
+ let current = expr;
10
+ let previous = null;
11
+ // Keep applying simplification rules until no more changes
12
+ while (previous === null || !current.equals(previous)) {
13
+ previous = current;
14
+ current = applySimplificationRules(current, context);
15
+ }
16
+ return current;
17
+ }
18
+ /**
19
+ * Apply simplification rules once.
20
+ */
21
+ function applySimplificationRules(expr, context) {
22
+ // Rule: left(h) → a if h has type and(a, b)
23
+ if (expr.name === 'left' && expr.children.length === 1) {
24
+ const arg = expr.children[0];
25
+ const argType = getTypeOfExpr(arg, context);
26
+ if (argType && argType.name === 'and' && argType.children.length === 2) {
27
+ return argType.children[0];
28
+ }
29
+ }
30
+ // Rule: right(h) → b if h has type and(a, b)
31
+ if (expr.name === 'right' && expr.children.length === 1) {
32
+ const arg = expr.children[0];
33
+ const argType = getTypeOfExpr(arg, context);
34
+ if (argType && argType.name === 'and' && argType.children.length === 2) {
35
+ return argType.children[1];
36
+ }
37
+ }
38
+ // Recursively simplify children
39
+ const simplifiedChildren = expr.children.map(child => applySimplificationRules(child, context));
40
+ return new Expression(expr.name, simplifiedChildren);
41
+ }
42
+ /**
43
+ * Get the type of an expression from the context.
44
+ */
45
+ function getTypeOfExpr(expr, context) {
46
+ // Simple case: variable name lookup
47
+ if (expr.children.length === 0) {
48
+ return context.getVariableType(expr.name) || null;
49
+ }
50
+ return null;
51
+ }
52
+ //# sourceMappingURL=simplifier.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"simplifier.js","sourceRoot":"","sources":["../src/simplifier.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAC;AAG7C;;GAEG;AACH,MAAM,UAAU,QAAQ,CAAC,IAAgB,EAAE,OAAgB;IACvD,IAAI,OAAO,GAAG,IAAI,CAAC;IACnB,IAAI,QAAQ,GAAsB,IAAI,CAAC;IAEvC,2DAA2D;IAC3D,OAAO,QAAQ,KAAK,IAAI,IAAI,CAAC,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,EAAE,CAAC;QACpD,QAAQ,GAAG,OAAO,CAAC;QACnB,OAAO,GAAG,wBAAwB,CAAC,OAAO,EAAE,OAAO,CAAC,CAAC;IACzD,CAAC;IAED,OAAO,OAAO,CAAC;AACnB,CAAC;AAED;;GAEG;AACH,SAAS,wBAAwB,CAAC,IAAgB,EAAE,OAAgB;IAChE,4CAA4C;IAC5C,IAAI,IAAI,CAAC,IAAI,KAAK,MAAM,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACrD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC5C,IAAI,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrE,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC;IACL,CAAC;IAED,6CAA6C;IAC7C,IAAI,IAAI,CAAC,IAAI,KAAK,OAAO,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QACtD,MAAM,GAAG,GAAG,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC7B,MAAM,OAAO,GAAG,aAAa,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;QAC5C,IAAI,OAAO,IAAI,OAAO,CAAC,IAAI,KAAK,KAAK,IAAI,OAAO,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACrE,OAAO,OAAO,CAAC,QAAQ,CAAC,CAAC,CAAC,CAAC;QAC/B,CAAC;IACL,CAAC;IAED,gCAAgC;IAChC,MAAM,kBAAkB,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,KAAK,CAAC,EAAE,CACjD,wBAAwB,CAAC,KAAK,EAAE,OAAO,CAAC,CAC3C,CAAC;IAEF,OAAO,IAAI,UAAU,CAAC,IAAI,CAAC,IAAI,EAAE,kBAAkB,CAAC,CAAC;AACzD,CAAC;AAED;;GAEG;AACH,SAAS,aAAa,CAAC,IAAgB,EAAE,OAAgB;IACrD,oCAAoC;IACpC,IAAI,IAAI,CAAC,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC7B,OAAO,OAAO,CAAC,eAAe,CAAC,IAAI,CAAC,IAAI,CAAC,IAAI,IAAI,CAAC;IACtD,CAAC;IAED,OAAO,IAAI,CAAC;AAChB,CAAC"}
@@ -0,0 +1,9 @@
1
+ /**
2
+ * Proof verification logic.
3
+ */
4
+ import { Block } from './block.js';
5
+ /**
6
+ * Verify all axioms and theorems in a file.
7
+ */
8
+ export declare function verifyFile(blocks: Block[], verbose?: boolean): void;
9
+ //# sourceMappingURL=verifier.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"verifier.d.ts","sourceRoot":"","sources":["../src/verifier.ts"],"names":[],"mappings":"AAAA;;GAEG;AAEH,OAAO,EAAE,KAAK,EAAE,MAAM,YAAY,CAAC;AAOnC;;GAEG;AACH,wBAAgB,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,EAAE,OAAO,GAAE,OAAe,GAAG,IAAI,CA4C1E"}