From 6dd1a626f30558c7cecaf8870a9a52bd12350d8e Mon Sep 17 00:00:00 2001 From: Akshay Nair Date: Fri, 22 Dec 2023 20:24:43 +0530 Subject: refactor: minor refactor of proofs --- src/equation.ts | 59 ++++++------- src/natural-numbers.ts | 235 ++++++++++++++++++++++++------------------------- 2 files changed, 145 insertions(+), 149 deletions(-) diff --git a/src/equation.ts b/src/equation.ts index cc668b1..e2cc2bc 100644 --- a/src/equation.ts +++ b/src/equation.ts @@ -1,48 +1,45 @@ -import { Op, Rewrite, ChainRewrites, Sym, Equation, VerifyEquation, assert, ApplyRewrite, Evaluate, OpToStr, SubstEq } from './utils/theorem'; +import { Op, Rewrite, ChainRewrites, Sym, Equation, VerifyEquation, assert, SubstEq } from './utils/theorem'; export namespace equation { type F = { op: 'F', a: X }; export type Reflexivity = Rewrite, 'true'>; - export type Symmetry = Rewrite, Equation>; + export type Commutativity = Rewrite, Equation>; export type Congruence = Rewrite, Equation, F>>; - export interface SubstituteEq_Proof { - type: 'rewrite', - known: { - 'a = b': Equation, - }, - left: Equation, F>; // f(a) = f(b) - right: ChainRewrites<[ - Sym>, // a = b - SubstEq, // b = b - Reflexivity, - ], this['left']>; - }; - export namespace spec { + export namespace proof { + export interface SubstituteEq_Proof { + type: 'rewrite', + known: { + 'a = b': Equation, + }, + left: Equation, F>; // f(a) = f(b) + right: ChainRewrites<[ + Sym>, // a = b + SubstEq, // b = b + Reflexivity, + ], this['left']>; + }; export type substitution = [ assert>>, ] } - export interface Transitivity_Proof { - type: 'rewrite', - known: { - 'a = b': Equation, - 'b = c': Equation, - }, - left: Equation, Equation>; // (a = b) = (b = c) - right: ChainRewrites<[ - SubstEq, // (b = b) = (b = c) - SubstEq>>, // (b = b) = (c = b) - Reflexivity, // true = (b = b) - Reflexivity, // true = true - Reflexivity<'true'>, - ], this['left']>; - }; - export namespace spec { + export namespace proof { + export interface Transitivity_Proof { + type: 'rewrite', + known: { + 'a = b': Equation, + 'b = c': Equation, + }, + left: Equation; // a = c + right: ChainRewrites<[ + SubstEq, // b = c + Rewrite, // true + ], this['left']>; + }; export type transitivity = [ assert>>, ] diff --git a/src/natural-numbers.ts b/src/natural-numbers.ts index fa8a3ce..046ec4c 100644 --- a/src/natural-numbers.ts +++ b/src/natural-numbers.ts @@ -11,26 +11,26 @@ export namespace addition { // Commutativity export type Commutativity = Rewrite, Add>; - export interface Comm_Base_Proof { - type: 'rewrite', - left: Equation, Add>; // 0 + b = b + 0 - right: ChainRewrites<[ - IdentityR, // b = b + 0 - Sym>, // b + 0 = b + 0 - Refl, - ], this['left']>; - }; - export interface Comm_Inductive_Proof { - type: 'rewrite', - left: Equation, B>, Add>>; // succ(a) + b = b + succ(a) - right: ChainRewrites<[ - SuccLemma, // succ(a + b) = b + succ(a) - Commutativity, // succ(b + a) = b + succ(a) - SuccLemmaR, // succ(b + a) = succ(b + a) - Refl, - ], this['left']>; - }; - export namespace spec { + export namespace proof { + export interface Comm_Base_Proof { + type: 'rewrite', + left: Equation, Add>; // 0 + b = b + 0 + right: ChainRewrites<[ + IdentityR, // b = b + 0 + Sym>, // b + 0 = b + 0 + Refl, + ], this['left']>; + }; + export interface Comm_Inductive_Proof { + type: 'rewrite', + left: Equation, B>, Add>>; // succ(a) + b = b + succ(a) + right: ChainRewrites<[ + SuccLemma, // succ(a + b) = b + succ(a) + Commutativity, // succ(b + a) = b + succ(a) + SuccLemmaR, // succ(b + a) = succ(b + a) + Refl, + ], this['left']>; + }; export type commutativity = [ assert>>, assert>>, @@ -39,29 +39,28 @@ export namespace addition { // Associativity export type Associativity = Rewrite, C>, Add>>; - export interface Assoc_Base_Proof { - 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, - ], this['left']>; - }; - export interface Assoc_Inductive_Proof { - type: 'rewrite', - left: Equation, B>, C>, Add, Add>>; // (succ(a) + b) + c = succ(a) + (b + c) - right: ChainRewrites<[ - SuccLemma, // succ(a + b) + c = succ(a) + (b + c) - SuccLemma>, // succ(a + b) + c = succ(a + (b + c)) - SuccLemma, C>, // succ((a + b) + c) = succ(a + (b + c)) - Associativity, // succ(a + (b + c)) = succ(a + (b + c)) - Refl, - ], this['left']>; - }; - - export namespace spec { + export namespace proof { + export interface Assoc_Base_Proof { + 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, + ], this['left']>; + }; + export interface Assoc_Inductive_Proof { + type: 'rewrite', + left: Equation, B>, C>, Add, Add>>; // (succ(a) + b) + c = succ(a) + (b + c) + right: ChainRewrites<[ + SuccLemma, // succ(a + b) + c = succ(a) + (b + c) + SuccLemma>, // succ(a + b) + c = succ(a + (b + c)) + SuccLemma, C>, // succ((a + b) + c) = succ(a + (b + c)) + Associativity, // succ(a + (b + c)) = succ(a + (b + c)) + Refl, + ], this['left']>; + }; export type associativity = [ assert>>, assert>>, @@ -69,16 +68,16 @@ export namespace addition { } // Rearrange - export interface Rearrange_Proof { - type: 'rewrite', - left: Equation, Add>, Add, D>>>; // (a + b) + (c + d) = a + ((b + c) + d) - right: ChainRewrites<[ - Associativity>, // a + (b + (c + d)) = a + ((b + c) + d) - Associativity, // a + (b + (c + d)) = a + (b + (c + d)) - Refl, - ], this['left']>; - }; - export namespace spec { + export namespace proof { + export interface Rearrange_Proof { + type: 'rewrite', + left: Equation, Add>, Add, D>>>; // (a + b) + (c + d) = a + ((b + c) + d) + right: ChainRewrites<[ + Associativity>, // a + (b + (c + d)) = a + ((b + c) + d) + Associativity, // a + (b + (c + d)) = a + (b + (c + d)) + Refl, + ], this['left']>; + }; export type rearrange = [ assert>>, ] @@ -95,26 +94,26 @@ export namespace multiplication { // Commutativity export type Commutativity = Rewrite, Multiply>; - export interface Comm_Base_Proof { - type: 'rewrite', - left: Equation, Multiply>; // 1 * b = b * 1 - right: ChainRewrites<[ - IdentityR, // b = b * 1 - Identity, // b = b - Refl, - ], this['left']>; - }; - export interface Comm_Inductive_Proof { - type: 'rewrite', - left: Equation, B>, Multiply>>; // succ(a)*b = b*succ(a) - right: ChainRewrites<[ - SuccLemma, // b + a*b = b*succ(a) - SuccLemmaR, // b + a*b = b + b*a - Commutativity, // b + a*b = b + a*b - Refl, - ], this['left']>; - }; - export namespace spec { + export namespace proof { + export interface Comm_Base_Proof { + type: 'rewrite', + left: Equation, Multiply>; // 1 * b = b * 1 + right: ChainRewrites<[ + IdentityR, // b = b * 1 + Identity, // b = b + Refl, + ], this['left']>; + }; + export interface Comm_Inductive_Proof { + type: 'rewrite', + left: Equation, B>, Multiply>>; // succ(a)*b = b*succ(a) + right: ChainRewrites<[ + SuccLemma, // b + a*b = b*succ(a) + SuccLemmaR, // b + a*b = b + b*a + Commutativity, // b + a*b = b + a*b + Refl, + ], this['left']>; + }; export type commutativity = [ assert>>, assert>>, @@ -124,30 +123,30 @@ export namespace multiplication { // Distributivity export type Distributivity = Rewrite, C>, Add, Multiply>>; - export interface Dist_Base_Proof { - type: 'rewrite', - left: Equation, C>, Add, Multiply>>; // (1 + b)*c = 1*c + b*c - right: ChainRewrites<[ - IdentityR, // (1 + b)*c = c + b*c - addition.SuccLemma<_0, B>, // succ(0 + b)*c = c + b*c - addition.IdentityR, // succ(b)*c = c + b*c - SuccLemma, // c + b*c = c + b*c - Refl, - ], this['left']>; - }; - export interface Dist_Inductive_Proof { - type: 'rewrite', - left: Equation, B>, C>, Add, C>, Multiply>>; // (succ(a) + b)*c = succ(a)*c + b*c - right: ChainRewrites<[ - addition.SuccLemma, // succ(a + b)*c = succ(a)*c + b*c - SuccLemma, C>, // c + (a + b)*c = succ(a)*c + b*c - SuccLemma, // c + (a + b)*c = (c + a*c) + b*c - Distributivity, // c + (a*c + b*c) = (c + a*c) + b*c - addition.Associativity, Multiply>, // (c + a*c) + b*c = (c + a*c) + b*c - Refl, - ], this['left']>; - }; - export namespace spec { + export namespace proof { + export interface Dist_Base_Proof { + type: 'rewrite', + left: Equation, C>, Add, Multiply>>; // (1 + b)*c = 1*c + b*c + right: ChainRewrites<[ + IdentityR, // (1 + b)*c = c + b*c + addition.SuccLemma<_0, B>, // succ(0 + b)*c = c + b*c + addition.IdentityR, // succ(b)*c = c + b*c + SuccLemma, // c + b*c = c + b*c + Refl, + ], this['left']>; + }; + export interface Dist_Inductive_Proof { + type: 'rewrite', + left: Equation, B>, C>, Add, C>, Multiply>>; // (succ(a) + b)*c = succ(a)*c + b*c + right: ChainRewrites<[ + addition.SuccLemma, // succ(a + b)*c = succ(a)*c + b*c + SuccLemma, C>, // c + (a + b)*c = succ(a)*c + b*c + SuccLemma, // c + (a + b)*c = (c + a*c) + b*c + Distributivity, // c + (a*c + b*c) = (c + a*c) + b*c + addition.Associativity, Multiply>, // (c + a*c) + b*c = (c + a*c) + b*c + Refl, + ], this['left']>; + }; export type distributivity = [ assert>>, assert>>, @@ -157,27 +156,27 @@ export namespace multiplication { // Associativity export type Associativity = Rewrite, C>, Multiply>>; - export interface Assoc_Base_Proof { - type: 'rewrite', - left: Equation, C>, Multiply<_1, Multiply>>; // (1*b)*c = 1*(b*c) - right: ChainRewrites<[ - IdentityR, // b*c = 1*(b*c) - IdentityR>, // b*c = b*c - Refl, - ], this['left']>; - }; - export interface Assoc_Inductive_Proof { - type: 'rewrite', - left: Equation, B>, C>, Multiply, Multiply>>; // (succ(a)*b)*c = succ(a)*(b*c) - right: ChainRewrites<[ - SuccLemma, // (b + a*b)*c = succ(a) * (b*c) - Distributivity, C>, // b*c + (a*b)*c = succ(a) * (b*c) - SuccLemma>, // b*c + (a*b)*c = b*c + a*(b*c) - Associativity, // b*c + a*(b*c) = b*c + a*(b*c) - Refl, - ], this['left']>; - }; - export namespace spec { + export namespace proof { + export interface Assoc_Base_Proof { + type: 'rewrite', + left: Equation, C>, Multiply<_1, Multiply>>; // (1*b)*c = 1*(b*c) + right: ChainRewrites<[ + IdentityR, // b*c = 1*(b*c) + IdentityR>, // b*c = b*c + Refl, + ], this['left']>; + }; + export interface Assoc_Inductive_Proof { + type: 'rewrite', + left: Equation, B>, C>, Multiply, Multiply>>; // (succ(a)*b)*c = succ(a)*(b*c) + right: ChainRewrites<[ + SuccLemma, // (b + a*b)*c = succ(a) * (b*c) + Distributivity, C>, // b*c + (a*b)*c = succ(a) * (b*c) + SuccLemma>, // b*c + (a*b)*c = b*c + a*(b*c) + Associativity, // b*c + a*(b*c) = b*c + a*(b*c) + Refl, + ], this['left']>; + }; export type associativity = [ assert>>, assert>>, -- cgit v1.3.1