module Data.ForeignNat.Divisibility where
open import Data.ForeignNat
open import Data.Bool using (Bool; true; false)
open import Relation.Binary.Core
open import Relation.Nullary
open import Relation.Nullary.Negation
open import Data.Nat
open import Data.Nat.Divisibility
open import Relation.Binary.PropositionalEquality
open import Data.Product
open import Algebra
import Data.Nat.Properties as Nat
private
module ℕ = CommutativeSemiring Nat.commutativeSemiring
{-# IMPORT Data.ForeignNat.Impl #-}
postulate
_/′_ : ℕ′ → ℕ′ → ℕ′
_%′_ : ℕ′ → ℕ′ → ℕ′
muldiv : ∀ {m n q r} → (q ≡ unmarshalℕ ((marshalℕ n) /′ (marshalℕ m))) → (r ≡ unmarshalℕ ((marshalℕ n) %′ (marshalℕ m))) → n ≡ q * m + r
∣-%-consistency : ∀ {m n} → m ∣ n → (marshalℕ n %′ marshalℕ m) ≡ zero
{-# COMPILED _/′_ Data.ForeignNat.Impl.divide #-}
{-# COMPILED _%′_ Data.ForeignNat.Impl.modulo #-}
_∣?′_ : Decidable _∣_
m ∣?′ n with ((marshalℕ n) %′ (marshalℕ m)) ≟′ zero
... | yes noRem with muldiv refl (cong unmarshalℕ (sym noRem))
... | n=q*m+0 = yes (divides q n=q*m)
where q = unmarshalℕ ((marshalℕ n) /′ (marshalℕ m))
n=q*m = begin
n
≡⟨ n=q*m+0 ⟩
q * m + 0
≡⟨ proj₂ ℕ.+-identity (q * m) ⟩
q * m
∎ where open ≡-Reasoning
m ∣?′ n | no rem = no λ m∣n → contradiction (∣-%-consistency m∣n) rem