aboutsummaryrefslogtreecommitdiff
path: root/src/util.ts
diff options
context:
space:
mode:
authorAkshay Nair <phenax5@gmail.com>2023-12-15 22:06:30 +0530
committerAkshay Nair <phenax5@gmail.com>2023-12-15 22:06:30 +0530
commit6f31fc62f9a6ee77d71c5f5fe352e027f495ae9a (patch)
tree1b77d761e3a15a6eddf662e0e3a4f12ef27e420c /src/util.ts
parent8ae8d7ab84d2ee38ee7cea4ff41598d135a9dc25 (diff)
downloadts-theorem-provinator-6f31fc62f9a6ee77d71c5f5fe352e027f495ae9a.tar.gz
ts-theorem-provinator-6f31fc62f9a6ee77d71c5f5fe352e027f495ae9a.zip
feat: equation proofs (substitution + transitivity)
Diffstat (limited to '')
-rw-r--r--src/util.ts15
1 files changed, 14 insertions, 1 deletions
diff --git a/src/util.ts b/src/util.ts
index c78c12c..da6d637 100644
--- a/src/util.ts
+++ b/src/util.ts
@@ -1,4 +1,14 @@
-export type Op = string | { op: string; a: Op; b: Op };
+type COp = { op: string; a: Op; b: Op }
+export type Op = string | COp;
+
+export type OpToStr<O extends Op> =
+ O extends string
+ ? O
+ : O extends { op: string, a: infer a extends string, b: infer b extends string } ? `(${a} ${O['op']} ${b})`
+ : O extends { op: string, a: infer a extends COp, b: infer b extends string } ? `(${OpToStr<a>} ${O['op']} ${b})`
+ : O extends { op: string, a: infer a extends string, b: infer b extends COp } ? `(${a} ${O['op']} ${OpToStr<b>})`
+ : O extends { op: string, a: infer a extends COp, b: infer b extends COp } ? `(${OpToStr<a>} ${O['op']} ${OpToStr<b>})`
+ : never;
type RwType = 'rewrite' | 'imperative';
@@ -6,6 +16,7 @@ export interface RewriteBase {
type: RwType;
left: Op;
right: Op;
+ assume?: Record<string, Op | RewriteBase>;
}
export interface Rewrite<left extends Op, right extends Op, Typ extends RwType = 'rewrite'> extends RewriteBase {
@@ -15,6 +26,7 @@ export interface Rewrite<left extends Op, right extends Op, Typ extends RwType =
};
export type Sym<R extends RewriteBase> = Rewrite<R['right'], R['left'], R['type']>;
+export type Subst<A extends Op, B extends Op> = Rewrite<A, B>
export type ApplyRewrite<O extends Op, R extends RewriteBase> =
R['type'] extends 'imperative' ? (R & { left: O })['right']
@@ -40,6 +52,7 @@ export type VerifyEquation<Eq extends RewriteBase> =
export type Evaluate<Eq extends RewriteBase> = ApplyRewrite<Eq['left'], Eq>;
export type assert<T extends true> = T;
+export type assertFalse<T extends false> = T;
export type Eq<a, b> = ([a] extends [b] ? ([b] extends [a] ? true : false & { lhs: a; rhs: b }) : false & { lhs: a; rhs: b });
export type Equation<A extends Op, B extends Op> = { op: '=', a: A, b: B };