| (* File: proofs/SafetyKernel.v |
| ProofBridge Liner — Formal Safety Kernel |
| ----------------------------------------- |
| Structural formalisation of the circuit-breaker state machine in Coq. |
| The key theorem: UNAUTH actors can never reset a HALTED kernel. |
| This file can be compiled with: coqc proofs/SafetyKernel.v |
| *) |
|
|
| Require Import QArith. |
|
|
| (* ------------------------------------------------------------------ *) |
| (* Types *) |
| (* ------------------------------------------------------------------ *) |
|
|
| Inductive State := OPEN | HALTED. |
|
|
| Inductive Actor := AUTH | UNAUTH. |
|
|
| Record KernelInput := { |
| posterior : Q; |
| threshold : Q; |
| actor : Actor |
| }. |
|
|
| (* ------------------------------------------------------------------ *) |
| (* Transition Function *) |
| (* ------------------------------------------------------------------ *) |
|
|
| (** [step s i] computes the next state from current state [s] and |
| input [i]. The HALTED state is absorbing for UNAUTH actors. *) |
| Definition step (s : State) (i : KernelInput) : State := |
| match s with |
| | OPEN => |
| if Qle_bool i.(threshold) i.(posterior) |
| then HALTED |
| else OPEN |
| | HALTED => |
| match i.(actor) with |
| | AUTH => OPEN |
| | UNAUTH => HALTED |
| end |
| end. |
|
|
| (* ------------------------------------------------------------------ *) |
| (* Theorems *) |
| (* ------------------------------------------------------------------ *) |
|
|
| (** Theorem 1 (Absorbing HALTED for UNAUTH): |
| An UNAUTH actor can never reset the circuit. |
| The HALTED state is absorbing when actor = UNAUTH. *) |
| Theorem unauthorized_halt_is_absorbing : |
| forall (i : KernelInput), |
| i.(actor) = UNAUTH -> |
| step HALTED i = HALTED. |
| Proof. |
| intros i H. |
| simpl. |
| rewrite H. |
| reflexivity. |
| Qed. |
|
|
| (** Theorem 2 (Monotone tripping): |
| If the posterior meets or exceeds the threshold, |
| the OPEN state transitions to HALTED. *) |
| Theorem posterior_above_threshold_trips : |
| forall (i : KernelInput), |
| Qle_bool i.(threshold) i.(posterior) = true -> |
| step OPEN i = HALTED. |
| Proof. |
| intros i H. |
| simpl. |
| rewrite H. |
| reflexivity. |
| Qed. |
|
|
| (** Theorem 3 (Safe below threshold): |
| If the posterior is strictly below the threshold, OPEN stays OPEN. *) |
| Theorem posterior_below_threshold_stays_open : |
| forall (i : KernelInput), |
| Qle_bool i.(threshold) i.(posterior) = false -> |
| step OPEN i = OPEN. |
| Proof. |
| intros i H. |
| simpl. |
| rewrite H. |
| reflexivity. |
| Qed. |
|
|
| (** Theorem 4 (AUTH can reset): |
| An AUTH actor always resets a HALTED kernel to OPEN. *) |
| Theorem auth_can_reset : |
| forall (i : KernelInput), |
| i.(actor) = AUTH -> |
| step HALTED i = OPEN. |
| Proof. |
| intros i H. |
| simpl. |
| rewrite H. |
| reflexivity. |
| Qed. |
|
|