diff options
| author | Akshay Nair <phenax5@gmail.com> | 2023-12-15 22:36:03 +0530 |
|---|---|---|
| committer | Akshay Nair <phenax5@gmail.com> | 2023-12-15 22:36:03 +0530 |
| commit | efc0358c1e2b52308d3df68aa713cef5dc6e6bfe (patch) | |
| tree | 40bac1f220895180c1cb99f044ac56eb4ed1ccbb /src/util.ts | |
| parent | 3d91b8c0fe73d24e3bcf13e7d7e8079f58975500 (diff) | |
| download | ts-theorem-provinator-efc0358c1e2b52308d3df68aa713cef5dc6e6bfe.tar.gz ts-theorem-provinator-efc0358c1e2b52308d3df68aa713cef5dc6e6bfe.zip | |
refactor: moves stuff around
Diffstat (limited to 'src/util.ts')
| -rw-r--r-- | src/util.ts | 75 |
1 files changed, 0 insertions, 75 deletions
diff --git a/src/util.ts b/src/util.ts deleted file mode 100644 index a4dd2e9..0000000 --- a/src/util.ts +++ /dev/null @@ -1,75 +0,0 @@ -type DyadicOp = { op: string; a: Op; b: Op } -type MonadicOp = { op: string; a: Op } -export type Op = string | MonadicOp | DyadicOp; - -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 DyadicOp, b: infer b extends string } ? `(${OpToStr<a>} ${O['op']} ${b})` - : O extends { op: string, a: infer a extends string, b: infer b extends DyadicOp } ? `(${a} ${O['op']} ${OpToStr<b>})` - : O extends { op: string, a: infer a extends DyadicOp, b: infer b extends DyadicOp } ? `(${OpToStr<a>} ${O['op']} ${OpToStr<b>})` - : O extends { op: string, a: infer a extends string } ? `${O['op']}(${a})` - : O extends { op: string, a: infer a extends DyadicOp } ? `${O['op']}(${OpToStr<a>})` - : never; - -type RwType = 'rewrite' | 'imperative'; - -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 { - type: Typ; - left: left; - right: right; -}; - -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'] - : O extends R['left'] ? R['right'] - : O extends string ? O - : O extends DyadicOp ? ( - ApplyRewrite<O['a'], R> extends O['a'] - ? (ApplyRewrite<O['b'], R> extends O['b'] ? O - : Omit<O, 'b'> & { b: ApplyRewrite<O['b'], R> }) - : Omit<O, 'a'> & { a: ApplyRewrite<O['a'], R> } - ) - : O extends MonadicOp ? ( - ApplyRewrite<O['a'], R> extends O['a'] ? O : Omit<O, 'a'> & { a: ApplyRewrite<O['a'], R> } - ) - : never; - -export type ChainRewrites<Rws extends RewriteBase[], O extends Op> = - Rws extends [] ? O - : Rws extends [infer R extends RewriteBase, ...infer Rs extends RewriteBase[]] - ? ChainRewrites<Rs, ApplyRewrite<O, R>> - : never; - -export type VerifyEquation<Eq extends RewriteBase> = - Eq['right'] extends 'true' ? true : false & Eq['right']; - -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 }; - -export interface Refl extends RewriteBase { - type: 'imperative'; - left: Op; - right: this['left'] extends { op: '=', a: infer a, b: infer b } - ? (Eq<a, b> extends true ? 'true' : this['left']) - : this['left']; -}; - -// Like Refl, but you have to specify the sides of the equation and this one works recursively -export type ReflR<A extends Op> = Rewrite<Equation<A, A>, 'true'>; |
