Research-Stack/0-Core-Formalism/lean/external/OTOM/GeneticCode.lean

189 lines
7.8 KiB
Text

/- Copyright (c) 2026 Sovereign Research Stack. All rights reserved.
Released under Apache 2.0 license as described in the file LICENSE.
Authors: Research Stack Team
GeneticCode.lean — Standard Genetic Code (NCBI Table 1)
This module formalizes the biological genetic code translation from DNA/RNA
codons to amino acids. It provides:
• DNA base representation (A, T, G, C)
• 20 canonical amino acids + stop codon
• Complete codon-to-amino-acid translation table
• Codon degeneracy analysis
• Start/stop codon identification
The genetic code is nearly universal across all known life forms, making
this a foundational component for biological encoding in the AVMR framework.
Per AGENTS.md §0: Lean is the source of truth.
Per AGENTS.md §3: Uses neutral technical terminology.
-/
namespace Semantics.GeneticCode
-- ════════════════════════════════════════════════════════════
-- §1 DNA/RNA Base Representation
-- ════════════════════════════════════════════════════════════
/-- The four DNA nucleotide bases: Adenine, Thymine, Guanine, Cytosine.
(RNA uses Uracil instead of Thymine, represented here as T for DNA focus) -/
inductive EventType
| a | t | g | c
deriving Repr, DecidableEq
/-- Convert base to bit representation (00, 01, 10, 11). -/
def eventBits : EventType → Nat
| .a => 0
| .g => 1
| .c => 2
| .t => 3
/-- Parity check for base-polarity combinations.
Used in phase calculations for shell state transitions. -/
def parityOfEvent (e : EventType) (polarity : Int) : Bool :=
let eb := eventBits e
let pb : Nat := if polarity ≥ 0 then 1 else 0
let x := Nat.xor eb pb
(x % 2) = 1
-- ════════════════════════════════════════════════════════════
-- §2 Amino Acid Types
-- ════════════════════════════════════════════════════════════
/-- The 20 canonical amino acids plus stop codon.
Standard IUPAC three-letter codes:
• Phe = Phenylalanine
• Leu = Leucine
• Ile = Isoleucine
• Met = Methionine (START codon)
• Val = Valine
• Ser = Serine
• Pro = Proline
• Thr = Threonine
• Ala = Alanine
• Tyr = Tyrosine
• His = Histidine
• Gln = Glutamine
• Asn = Asparagine
• Lys = Lysine
• Asp = Aspartic Acid
• Glu = Glutamic Acid
• Cys = Cysteine
• Trp = Tryptophan
• Arg = Arginine
• Gly = Glycine
• stop = Stop/Termination codon -/
inductive AminoAcid
| phe | leu | ile | met | val | ser | pro | thr | ala | tyr | his | gln
| asn | lys | asp | glu | cys | trp | arg | gly | stop
deriving Repr, DecidableEq, BEq
/-- Encode amino acid as UInt8 (0-19 for amino acids, 255 for stop). -/
def AminoAcid.toUInt8 : AminoAcid → UInt8
| .phe => 0 | .leu => 1 | .ile => 2 | .met => 3 | .val => 4
| .ser => 5 | .pro => 6 | .thr => 7 | .ala => 8 | .tyr => 9
| .his => 10 | .gln => 11 | .asn => 12 | .lys => 13 | .asp => 14
| .glu => 15 | .cys => 16 | .trp => 17 | .arg => 18 | .gly => 19
| .stop => 255
-- ════════════════════════════════════════════════════════════
-- §3 Codon Structure and Translation
-- ════════════════════════════════════════════════════════════
/-- A codon is a triplet of DNA bases.
In the genetic code, each triplet maps to one amino acid or stop. -/
structure Codon where
first : EventType
second : EventType
third : EventType
deriving Repr, DecidableEq, BEq
/-- Convert codon to 6-bit representation.
Bits: [first:2][second:2][third:2] -/
def Codon.toBits (c : Codon) : Nat :=
eventBits c.first * 16 + eventBits c.second * 4 + eventBits c.third
/-- Standard genetic code translation (NCBI Table 1).
Maps 64 codons to 20 amino acids + 3 stop codons.
This is the "universal" genetic code used by most organisms.
Some organelles (mitochondria) and organisms use variant codes. -/
def geneticCode (c : Codon) : AminoAcid :=
match c.first, c.second, c.third with
-- T (U) first
| .t, .t, .t => .phe | .t, .t, .c => .phe
| .t, .t, .a => .leu | .t, .t, .g => .leu
| .t, .c, .t => .ser | .t, .c, .c => .ser | .t, .c, .a => .ser | .t, .c, .g => .ser
| .t, .a, .t => .tyr | .t, .a, .c => .tyr
| .t, .a, .a => .stop | .t, .a, .g => .stop
| .t, .g, .t => .cys | .t, .g, .c => .cys
| .t, .g, .a => .stop
| .t, .g, .g => .trp
-- C first
| .c, .t, .t => .leu | .c, .t, .c => .leu | .c, .t, .a => .leu | .c, .t, .g => .leu
| .c, .c, .t => .pro | .c, .c, .c => .pro | .c, .c, .a => .pro | .c, .c, .g => .pro
| .c, .a, .t => .his | .c, .a, .c => .his
| .c, .a, .a => .gln | .c, .a, .g => .gln
| .c, .g, .t => .arg | .c, .g, .c => .arg | .c, .g, .a => .arg | .c, .g, .g => .arg
-- A first
| .a, .t, .t => .ile | .a, .t, .c => .ile | .a, .t, .a => .ile
| .a, .t, .g => .met
| .a, .c, .t => .thr | .a, .c, .c => .thr | .a, .c, .a => .thr | .a, .c, .g => .thr
| .a, .a, .t => .asn | .a, .a, .c => .asn
| .a, .a, .a => .lys | .a, .a, .g => .lys
| .a, .g, .t => .ser | .a, .g, .c => .ser
| .a, .g, .a => .arg | .a, .g, .g => .arg
-- G first
| .g, .t, .t => .val | .g, .t, .c => .val | .g, .t, .a => .val | .g, .t, .g => .val
| .g, .c, .t => .ala | .g, .c, .c => .ala | .g, .c, .a => .ala | .g, .c, .g => .ala
| .g, .a, .t => .asp | .g, .a, .c => .asp
| .g, .a, .a => .glu | .g, .a, .g => .glu
| .g, .g, .t => .gly | .g, .g, .c => .gly | .g, .g, .a => .gly | .g, .g, .g => .gly
-- ════════════════════════════════════════════════════════════
-- §4 Codon Properties
-- ════════════════════════════════════════════════════════════
/-- AUG is the canonical start codon (codes for Met).
In prokaryotes, GUG and UUG can also serve as start codons. -/
def isStartCodon (c : Codon) : Bool :=
c.first == .a && c.second == .t && c.third == .g
/-- UAA, UAG, UGA are stop codons (using DNA notation: TAA, TAG, TGA).
These signal translation termination. -/
def isStopCodon (c : Codon) : Bool :=
geneticCode c == .stop
/-- Codon degeneracy: how many codons code for each amino acid.
The genetic code is degenerate (multiple codons per amino acid).
Degeneracy levels:
• 6-fold: Leu, Arg, Ser
• 4-fold: Val, Pro, Thr, Ala, Gly
• 3-fold: Ile, Stop
• 2-fold: Phe, Tyr, His, Gln, Asn, Lys, Asp, Glu, Cys
• 1-fold: Met, Trp (no degeneracy) -/
def codonDegeneracy (aa : AminoAcid) : Nat :=
match aa with
| .phe | .tyr | .his | .gln | .asn | .lys | .asp | .glu | .cys => 2
| .ile | .stop => 3
| .leu | .ser | .arg => 6
| .met | .trp => 1
| .val | .pro | .thr | .ala | .gly => 4
/-- Example codons for verification. -/
def exampleStartCodon : Codon := { first := .a, second := .t, third := .g }
def exampleStopCodon : Codon := { first := .t, second := .a, third := .a }
def examplePheCodon : Codon := { first := .t, second := .t, third := .t }
#eval isStartCodon exampleStartCodon -- Expected: true
#eval isStopCodon exampleStopCodon -- Expected: true
#eval geneticCode examplePheCodon -- Expected: AminoAcid.phe
#eval codonDegeneracy AminoAcid.leu -- Expected: 6
end Semantics.GeneticCode