From ade99f3f1fc2da1d51a82f1376c61ad609d60ff1 Mon Sep 17 00:00:00 2001 From: Akshay Nair Date: Tue, 12 Dec 2023 17:58:46 +0530 Subject: feat: associativity and commutativity for addition --- src/index.ts | 112 +++++++++++++++++++++++++++++------------------------------ 1 file changed, 56 insertions(+), 56 deletions(-) (limited to 'src/index.ts') diff --git a/src/index.ts b/src/index.ts index 575c446..a161134 100644 --- a/src/index.ts +++ b/src/index.ts @@ -1,57 +1,57 @@ -import { Op, Rewrite, ChainRewrites, Flip } from './util'; - -export type Add = { op: '+'; a: A; b: B }; -export type Succ = Add<'1', A>; - -export type Identity = Rewrite, A>; -export type Commutativity = Rewrite, Add>; - -export interface Assoc0 { - type: 'rewrite', - left: Add, B>; // (0 + a) + b - right: ChainRewrites<[ - Commutativity<'0', A>, // = (a + 0) + b - Identity, // = a + b - Flip>>, // = (a + b) + 0 - Commutativity, '0'>, // = 0 + (a + b) - ], this['left']>; -}; - -export type Assoc1 = Rewrite, B>, Succ>>; - -export interface Assoc { - type: 'rewrite', - left: Add, C>; // (a + b) + c - right: ChainRewrites<[ - Rewrite>, // = CHEATING - Assoc1, // = succ(a + b) + c - Assoc1, C>, // = succ(a + b + c) - Rewrite, // CHEATING. TODO: figure out recursion - Assoc0, // Induction base case - Rewrite<'0', A>, // CHEATING - Flip>>, // = succ(a) + (b + c) - Rewrite, A>, // = CHEATING - ], this['left']>; -}; - -// type _x = ApplyRewrite, 'C'>, AssocN<'A', 'B', 'C'>> - -/* -Assoc: (a + b) + c = a + (b + c) - -For a = 0, -(0 + b) + c -= (b + 0) + c -- comm -= b + c -- id -= (b + c) + 0 -- flip id -= 0 + (b + c) -- comm - -For a' = succ(a), -(succ(a) + b) + c -= succ(a + b) + c -= succ((a + b) + c) ------ rec -= succ(a + (b + c)) -= succ(a) + (b + c) -*/ +import { Add, Multiply, Succ, _0 } from './nat'; +import { Op, Rewrite, ChainRewrites, Flip, Equation, Refl } from './util'; + +export namespace addition { + export type Identity = Rewrite, A>; + export type IdentityR = Rewrite, A>; + + export type SumSucc1 = Rewrite, B>, Succ>> + export type SumSucc2 = Rewrite>, Succ>> + + /// Sum commutativity + export type Commutativity = Rewrite, Add>; + export interface Comm_Base { + type: 'rewrite', + left: Equation, Add>; // 0 + b = b + 0 + right: ChainRewrites<[ + IdentityR, // b = b + 0 + Flip>, // b + 0 = b + 0 + Refl>, // true + ], this['left']>; + }; + export interface Comm_Inductive { + type: 'rewrite', + left: Equation, B>, Add>>; // succ(a) + b = b + succ(a) + right: ChainRewrites<[ + SumSucc1, // succ(a + b) = b + succ(a) + Commutativity, // succ(b + a) = b + succ(a) + SumSucc2, // succ(b + a) = succ(b + a) + Refl>>, // true + ], this['left']>; + }; + + // Sum associativity + export type Associativity = Rewrite, C>, Add>>; + export interface Assoc_Base { + type: 'rewrite', + left: Equation, C>, Add<'0', Add>>; // (0 + b) + c = 0 + (b + c) + right: ChainRewrites<[ + Commutativity<'0', B>, // (b + 0) + c = 0 + (b + c) + Identity, // b + c = 0 + (b + c) + IdentityR>, // b + c = b + c + Refl>, // true + ], this['left']>; + }; + export interface Assoc_Inductive { + type: 'rewrite', + left: Equation, B>, C>, Add, Add>>; // (succ(a) + b) + c = succ(a) + (b + c) + right: ChainRewrites<[ + SumSucc1, // succ(a + b) + c = succ(a) + (b + c) + SumSucc1>, // succ(a + b) + c = succ(a + (b + c)) + SumSucc1, C>, // succ((a + b) + c) = succ(a + (b + c)) + Associativity, // succ(a + (b + c)) = succ(a + (b + c)) + Refl>>>, // true + ], this['left']>; + }; +} -- cgit v1.3.1