mirror of
https://github.com/allaunthefox/Research-Stack.git
synced 2026-07-31 03:05:21 +00:00
189 lines
7.8 KiB
Text
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
|