1313
1414 Author: Jonathan D. A. Jewell
1515 Project: Absolute Zero
16- License: AGPL-3.0 / Palimpsest 0.5
16+ License: PMPL-1.0-or-later
1717 *)
1818
1919Require Import Coq.Logic.FunctionalExtensionality.
20+ Require Import Coq.Logic.ProofIrrelevance.
2021Require Import Coq.Program .Equality .
22+ Require Import Coq.Lists.List.
23+ Import ListNotations.
2124Require Import CNO.
2225
2326(** ** Category Definition *)
@@ -84,6 +87,17 @@ Proof.
8487 constructor.
8588Defined .
8689
90+ (** Morphism extensional equality: morphisms with the same program are equal.
91+ This uses proof irrelevance for the eval witness. *)
92+ Lemma morph_eq_ext :
93+ forall s1 s2 (m1 m2 : ProgramMorphism s1 s2),
94+ morph_program m1 = morph_program m2 -> m1 = m2.
95+ Proof .
96+ intros s1 s2 [p1 H1] [p2 H2]. simpl.
97+ intros Heq. subst.
98+ f_equal. apply proof_irrelevance.
99+ Qed .
100+
87101(** Programs form a category *)
88102Instance ProgramCategory : Category := {
89103 Obj := ProgramState;
@@ -92,25 +106,22 @@ Instance ProgramCategory : Category := {
92106 id := id_morphism;
93107}.
94108Proof .
95- - (* compose_assoc *)
109+ - (* compose_assoc: (f ++ g) ++ h = f ++ (g ++ h) *)
96110 intros A B C D h g f.
97- destruct f as [pf Hf].
98- destruct g as [pg Hg].
99- destruct h as [ph Hh].
100- unfold compose_morphisms.
101- (* Prove morphism equality *)
102- admit.
103- - (* compose_id_left *)
111+ apply morph_eq_ext.
112+ destruct f as [pf Hf], g as [pg Hg], h as [ph Hh].
113+ simpl. apply app_assoc.
114+ - (* compose_id_left: p ++ [] = p *)
104115 intros A B f.
105- destruct f as [p Hp] .
106- unfold compose_morphisms, id_morphism .
107- admit .
108- - (* compose_id_right *)
116+ apply morph_eq_ext .
117+ destruct f as [p Hp]. simpl .
118+ apply app_nil_r .
119+ - (* compose_id_right: [] ++ p = p *)
109120 intros A B f.
110- destruct f as [p Hp] .
111- unfold compose_morphisms, id_morphism .
112- admit .
113- Admitted .
121+ apply morph_eq_ext .
122+ destruct f as [p Hp]. simpl .
123+ reflexivity .
124+ Qed .
114125
115126(** ** Categorical CNO Definition *)
116127
@@ -126,23 +137,41 @@ Definition program_is_CNO_categorical (p : Program) (s : ProgramState) : Prop :=
126137
127138(** ** Equivalence of Definitions *)
128139
129- (** Theorem: Categorical CNO definition is equivalent to our original *)
140+ (** Categorical CNO characterization: CNO = termination + identity.
141+ Purity and thermodynamic reversibility follow from identity
142+ in our model:
143+ - Purity: state equality implies memory and I/O equality
144+ - Thermo reversibility: energy_dissipated is defined as 0 for all programs
145+ *)
130146Theorem cno_categorical_equiv :
131147 forall (p : Program),
132148 is_CNO p <->
149+ (forall s, terminates p s) /\
133150 (forall s s', eval p s s' -> s =st= s').
134151Proof .
135152 intros p.
136153 split; intros H.
137- - (* -> direction: Original definition implies identity *)
138- destruct H as [_ [H_id _]].
139- intros s s' H_eval.
140- apply H_id.
141- assumption.
142- - (* <- direction: Identity implies original definition *)
143- (* Need to construct full CNO proof *)
144- admit.
145- Admitted .
154+ - (* -> direction: Extract termination and identity from CNO *)
155+ destruct H as [H_term [H_id _]].
156+ split; assumption.
157+ - (* <- direction: Construct full CNO from termination + identity *)
158+ destruct H as [H_term H_id].
159+ unfold is_CNO.
160+ repeat split.
161+ + (* Termination *)
162+ exact H_term.
163+ + (* Identity *)
164+ exact H_id.
165+ + (* Purity: follows from state equality *)
166+ intros s s' H_eval.
167+ assert (H_eq : s =st= s') by (apply H_id; assumption).
168+ destruct H_eq as [H_mem [H_reg [H_io H_pc]]].
169+ unfold pure, no_io, no_memory_alloc.
170+ split; assumption.
171+ + (* Thermodynamic reversibility: trivially true *)
172+ unfold thermodynamically_reversible, energy_dissipated.
173+ intros. reflexivity.
174+ Qed .
146175
147176(** ** Universal Property *)
148177
@@ -270,10 +299,21 @@ Qed.
270299
271300(** The Yoneda lemma relates objects to their morphism sets *)
272301
273- (** Representable functor *)
274- Definition hom_functor (C : Category) (A : @Obj C) :
275- Functor C C.
276- Admitted .
302+ (** Representable functor Hom(A, -)
303+
304+ NOTE: The standard Hom functor maps C → Set (category of types),
305+ not C → C. The target category should be Type/Set, not C itself.
306+ A proper definition would require a SetCategory instance:
307+
308+ Definition hom_functor (C : Category) (A : @Obj C) :
309+ Functor C SetCategory.
310+
311+ For now we leave this as an axiom since:
312+ 1. The Yoneda theorem (yoneda_cno) is already proven without it
313+ 2. Defining SetCategory requires universe polymorphism
314+ 3. The conceptual result (CNOs = identity under Yoneda) stands
315+ *)
316+ Axiom hom_functor : forall (C : Category) (A : @Obj C), Functor C C.
277317
278318(** CNOs are precisely those elements that correspond to identity
279319 under the Yoneda embedding *)
0 commit comments