{-# OPTIONS --safe --cubical-compatible --guardedness --exact-split --double-check #-}
module ALMA.Physics.Newton.Poisson where
open import Data.Rational using (ℚ; 0ℚ; 1ℚ; _+_; _*_; -_)
open import Data.Rational.Properties using
(+-assoc; +-identityˡ; +-identityʳ; +-inverseʳ; +-comm; *-assoc
; *-comm; *-zeroˡ; *-zeroʳ; *-identityˡ; *-distribˡ-+; *-distribʳ-+
; neg-distrib-+; neg-distribʳ-*)
open import Relation.Binary.PropositionalEquality using
(_≡_; refl; sym; cong; cong₂; module ≡-Reasoning)
open import ALMA.Physics.RationalKit using (neg-involutive)
record Obs : Set where
constructor obs
field
c : ℚ
a : ℚ
b : ℚ
open Obs
add : Obs → Obs → Obs
add (obs c a b) (obs c' a' b') = obs (c + c') (a + a') (b + b')
scale : ℚ → Obs → Obs
scale r (obs c a b) = obs (r * c) (r * a) (r * b)
neg : Obs → Obs
neg (obs c a b) = obs (- c) (- a) (- b)
zero : Obs
zero = obs 0ℚ 0ℚ 0ℚ
one : Obs
one = obs 1ℚ 0ℚ 0ℚ
qO : Obs
qO = obs 0ℚ 1ℚ 0ℚ
pO : Obs
pO = obs 0ℚ 0ℚ 1ℚ
bracket : Obs → Obs → Obs
bracket (obs _ a b) (obs _ a' b') = obs (a * b' + - (b * a')) 0ℚ 0ℚ
infix 6 bracket
bracket-self : ∀ f → bracket f f ≡ zero
bracket-self (obs _ a b) =
cong (λ x → obs x 0ℚ 0ℚ) lemma
where
lemma : a * b + - (b * a) ≡ 0ℚ
lemma = let open ≡-Reasoning in begin
a * b + - (b * a)
≡⟨ cong (λ x → a * b + - x) (*-comm b a) ⟩
a * b + - (a * b)
≡⟨ +-inverseʳ (a * b) ⟩
0ℚ ∎
bracket-skew : ∀ f g → bracket g f ≡ neg (bracket f g)
bracket-skew (obs _ a b) (obs _ a' b') =
cong (λ x → obs x 0ℚ 0ℚ) lemma
where
lemma : a' * b + - (b' * a) ≡ - (a * b' + - (b * a'))
lemma = let open ≡-Reasoning in begin
a' * b + - (b' * a)
≡⟨ cong₂ (λ x y → x + - y) (*-comm a' b) (*-comm b' a) ⟩
b * a' + - (a * b')
≡⟨ +-comm (b * a') (- (a * b')) ⟩
- (a * b') + b * a'
≡⟨ cong (λ x → - (a * b') + x) (sym (neg-involutive (b * a'))) ⟩
- (a * b') + - (- (b * a'))
≡⟨ sym (neg-distrib-+ (a * b') (- (b * a'))) ⟩
- (a * b' + - (b * a')) ∎
bracket-qp : bracket qO pO ≡ one
bracket-qp = refl
bracket-qq : bracket qO qO ≡ zero
bracket-qq = bracket-self qO
bracket-pp : bracket pO pO ≡ zero
bracket-pp = bracket-self pO
bracket-addˡ : ∀ f g h →
bracket (add f g) h ≡ add (bracket f h) (bracket g h)
bracket-addˡ (obs _ af bf) (obs _ ag bg) (obs _ ah bh) =
cong (λ x → obs x 0ℚ 0ℚ) lemma
where
lemma : (af + ag) * bh + - ((bf + bg) * ah)
≡ (af * bh + - (bf * ah)) + (ag * bh + - (bg * ah))
lemma = let open ≡-Reasoning in begin
(af + ag) * bh + - ((bf + bg) * ah)
≡⟨ cong₂ (λ x y → x + - y) (*-distribʳ-+ bh af ag)
(*-distribʳ-+ ah bf bg) ⟩
(af * bh + ag * bh) + - (bf * ah + bg * ah)
≡⟨ cong ((af * bh + ag * bh) +_)
(neg-distrib-+ (bf * ah) (bg * ah)) ⟩
(af * bh + ag * bh) + (- (bf * ah) + - (bg * ah))
≡⟨ swap4 (af * bh) (ag * bh) (- (bf * ah)) (- (bg * ah)) ⟩
(af * bh + - (bf * ah)) + (ag * bh + - (bg * ah)) ∎
where
swap4 : ∀ w x y z → (w + x) + (y + z) ≡ (w + y) + (x + z)
swap4 w x y z = let open ≡-Reasoning in begin
(w + x) + (y + z)
≡⟨ +-assoc w x (y + z) ⟩
w + (x + (y + z))
≡⟨ cong (w +_) (sym (+-assoc x y z)) ⟩
w + ((x + y) + z)
≡⟨ cong (λ t → w + (t + z)) (+-comm x y) ⟩
w + ((y + x) + z)
≡⟨ cong (w +_) (+-assoc y x z) ⟩
w + (y + (x + z))
≡⟨ sym (+-assoc w y (x + z)) ⟩
(w + y) + (x + z) ∎
bracket-addʳ : ∀ f g h →
bracket f (add g h) ≡ add (bracket f g) (bracket f h)
bracket-addʳ f g h = let open ≡-Reasoning in begin
bracket f (add g h)
≡⟨ bracket-skew (add g h) f ⟩
neg (bracket (add g h) f)
≡⟨ cong neg (bracket-addˡ g h f) ⟩
neg (add (bracket g f) (bracket h f))
≡⟨ neg-add (bracket g f) (bracket h f) ⟩
add (neg (bracket g f)) (neg (bracket h f))
≡⟨ cong₂ add (sym (bracket-skew g f)) (sym (bracket-skew h f)) ⟩
add (bracket f g) (bracket f h) ∎
where
neg-add : ∀ u v → neg (add u v) ≡ add (neg u) (neg v)
neg-add (obs c a b) (obs c' a' b') = let open ≡-Reasoning in begin
obs (- (c + c')) (- (a + a')) (- (b + b'))
≡⟨ cong (λ x → obs x (- (a + a')) (- (b + b')))
(neg-distrib-+ c c') ⟩
obs (- c + - c') (- (a + a')) (- (b + b'))
≡⟨ cong₂ (obs (- c + - c'))
(neg-distrib-+ a a') (neg-distrib-+ b b') ⟩
obs (- c + - c') (- a + - a') (- b + - b') ∎
bracket-scaleˡ : ∀ r f g →
bracket (scale r f) g ≡ scale r (bracket f g)
bracket-scaleˡ r f@(obs _ a b) g@(obs _ a' b') =
let open ≡-Reasoning in begin
bracket (scale r f) g
≡⟨ cong (λ x → obs x 0ℚ 0ℚ) lemma ⟩
obs (r * (a * b' + - (b * a'))) 0ℚ 0ℚ
≡⟨ cong₂ (obs (r * (a * b' + - (b * a'))))
(sym (*-zeroʳ r)) (sym (*-zeroʳ r)) ⟩
obs (r * (a * b' + - (b * a'))) (r * 0ℚ) (r * 0ℚ) ∎
where
lemma : (r * a) * b' + - ((r * b) * a')
≡ r * (a * b' + - (b * a'))
lemma = let open ≡-Reasoning in begin
(r * a) * b' + - ((r * b) * a')
≡⟨ cong₂ (λ x y → x + - y) (*-assoc r a b') (*-assoc r b a') ⟩
r * (a * b') + - (r * (b * a'))
≡⟨ cong (r * (a * b') +_) (neg-distribʳ-* r (b * a')) ⟩
r * (a * b') + r * (- (b * a'))
≡⟨ sym (*-distribˡ-+ r (a * b') (- (b * a'))) ⟩
r * (a * b' + - (b * a')) ∎
bracket-scaleʳ : ∀ r f g →
bracket f (scale r g) ≡ scale r (bracket f g)
bracket-scaleʳ r f g = let open ≡-Reasoning in begin
bracket f (scale r g)
≡⟨ bracket-skew (scale r g) f ⟩
neg (bracket (scale r g) f)
≡⟨ cong neg (bracket-scaleˡ r g f) ⟩
neg (scale r (bracket g f))
≡⟨ neg-scale r (bracket g f) ⟩
scale r (neg (bracket g f))
≡⟨ cong (scale r) (sym (bracket-skew g f)) ⟩
scale r (bracket f g) ∎
where
neg-scale : ∀ r u → neg (scale r u) ≡ scale r (neg u)
neg-scale r (obs c a b) = let open ≡-Reasoning in begin
obs (- (r * c)) (- (r * a)) (- (r * b))
≡⟨ cong (λ x → obs x (- (r * a)) (- (r * b)))
(neg-distribʳ-* r c) ⟩
obs (r * - c) (- (r * a)) (- (r * b))
≡⟨ cong₂ (obs (r * - c))
(neg-distribʳ-* r a) (neg-distribʳ-* r b) ⟩
obs (r * - c) (r * - a) (r * - b) ∎
central-kill : ∀ k h → bracket (obs k 0ℚ 0ℚ) h ≡ zero
central-kill k (obs _ a b) = cong (λ x → obs x 0ℚ 0ℚ) lemma
where
lemma : 0ℚ * b + - (0ℚ * a) ≡ 0ℚ
lemma = let open ≡-Reasoning in begin
0ℚ * b + - (0ℚ * a)
≡⟨ cong₂ (λ x y → x + - y) (*-zeroˡ b) (*-zeroˡ a) ⟩
0ℚ + - 0ℚ
≡⟨ +-inverseʳ 0ℚ ⟩
0ℚ ∎
nested-zero : ∀ f g h → bracket (bracket f g) h ≡ zero
nested-zero (obs _ af bf) (obs _ ag bg) h =
central-kill (af * bg + - (bf * ag)) h
add-zeroˡ : ∀ u → add zero u ≡ u
add-zeroˡ (obs c a b) = let open ≡-Reasoning in begin
obs (0ℚ + c) (0ℚ + a) (0ℚ + b)
≡⟨ cong (λ x → obs x (0ℚ + a) (0ℚ + b)) (+-identityˡ c) ⟩
obs c (0ℚ + a) (0ℚ + b)
≡⟨ cong₂ (obs c) (+-identityˡ a) (+-identityˡ b) ⟩
obs c a b ∎
jacobi : ∀ f g h →
add (add (bracket (bracket f g) h)
(bracket (bracket g h) f))
(bracket (bracket h f) g) ≡ zero
jacobi f g h = let open ≡-Reasoning in begin
add (add (bracket (bracket f g) h)
(bracket (bracket g h) f))
(bracket (bracket h f) g)
≡⟨ cong₂ (λ x y → add (add x (bracket (bracket g h) f)) y)
(nested-zero f g h) (nested-zero h f g) ⟩
add (add zero (bracket (bracket g h) f)) zero
≡⟨ cong (λ x → add (add zero x) zero) (nested-zero g h f) ⟩
add (add zero zero) zero
≡⟨ cong (λ x → add x zero) (add-zeroˡ zero) ⟩
add zero zero
≡⟨ add-zeroˡ zero ⟩
zero ∎
X : Obs → Obs → Obs
X H f = bracket f H
eom-q : ∀ H → X H qO ≡ obs (b H) 0ℚ 0ℚ
eom-q (obs _ a b) = let open ≡-Reasoning in begin
obs (1ℚ * b + - (0ℚ * a)) 0ℚ 0ℚ
≡⟨ cong (λ x → obs x 0ℚ 0ℚ) lemma ⟩
obs b 0ℚ 0ℚ ∎
where
lemma : 1ℚ * b + - (0ℚ * a) ≡ b
lemma = let open ≡-Reasoning in begin
1ℚ * b + - (0ℚ * a)
≡⟨ cong (λ x → 1ℚ * b + - x) (*-zeroˡ a) ⟩
1ℚ * b + - 0ℚ
≡⟨ cong (λ x → x + - 0ℚ) (*-identityˡ b) ⟩
b + - 0ℚ
≡⟨ +-identityʳ b ⟩
b ∎
eom-p : ∀ H → X H pO ≡ obs (- a H) 0ℚ 0ℚ
eom-p (obs _ a b) = let open ≡-Reasoning in begin
obs (0ℚ * b + - (1ℚ * a)) 0ℚ 0ℚ
≡⟨ cong (λ x → obs x 0ℚ 0ℚ) lemma ⟩
obs (- a) 0ℚ 0ℚ ∎
where
lemma : 0ℚ * b + - (1ℚ * a) ≡ - a
lemma = let open ≡-Reasoning in begin
0ℚ * b + - (1ℚ * a)
≡⟨ cong (λ x → 0ℚ * b + - x) (*-identityˡ a) ⟩
0ℚ * b + - a
≡⟨ cong (λ x → x + - a) (*-zeroˡ b) ⟩
0ℚ + - a
≡⟨ +-identityˡ (- a) ⟩
- a ∎
energy-conserved : ∀ H → X H H ≡ zero
energy-conserved H = bracket-self H
H-const-force : Obs
H-const-force = obs 0ℚ (- (1ℚ + 1ℚ)) 1ℚ
const-force-qdot : X H-const-force qO ≡ one
const-force-qdot = refl
const-force-pdot : X H-const-force pO ≡ obs (1ℚ + 1ℚ) 0ℚ 0ℚ
const-force-pdot = refl
const-force-energy : X H-const-force H-const-force ≡ zero
const-force-energy = energy-conserved H-const-force