-- Andreas, 2012-04-03, reported by pumpkingod
module Issue596 where

import Common.Irrelevance
open import Common.Level
open import Common.Equality
open import Common.Prelude renaming (Nat to ℕ)

-- inlined from Data.Product

record Σ {a b} (A : Set a) (B : A → Set b) : Set (a ⊔ b) where
  constructor _,_
  field
    proj₁ : A
    proj₂ : B proj₁
open Σ public

syntax Σ A (λ x → B) = Σ[ x ∶ A ] B

∃ : ∀ {a b} {A : Set a} → (A → Set b) → Set (a ⊔ b)
∃ = Σ _

infixr 2 _×_

_×_ : ∀ {a b} (A : Set a) (B : Set b) → Set (a ⊔ b)
A × B = Σ[ x ∶ A ] B

-- inlined from Data.Nat.Divisibility and Data.Nat.Coprimality

infix 4 _∣_

data _∣_ : ℕ → ℕ → Set where
  divides : {m n : ℕ} (q : ℕ) (eq : n ≡ q * m) → m ∣ n

Coprime : (m n : ℕ) → Set
Coprime m n = ∀ {i} → i ∣ m × i ∣ n → i ≡ 1

record ℚ⁺ : Set where
  constructor rat⁺
  field
    numerator     : ℕ
    denominator-1 : ℕ

  denominator : ℕ
  denominator = suc denominator-1

  field
    .coprime      : Coprime numerator denominator

-- inlined from Data.Nat.LCM

record LCM (i j lcm : ℕ) : Set where
  constructor is -- Andreas, 2012-04-02 added constructor
  field
    -- The lcm is a common multiple.
    commonMultiple : i ∣ lcm × j ∣ lcm

    -- The lcm divides all common multiples, i.e. the lcm is the least
    -- common multiple according to the partial order _∣_.
    least : ∀ {m} → i ∣ m × j ∣ m → lcm ∣ m

postulate
  lcm : (i j : ℕ) → ∃ λ d → LCM i j d
  undefined : ∀ {a}{A : Set a} → A

0#⁺ : ℚ⁺
0#⁺ = rat⁺ 0 0 undefined -- (∣1⇒≡1 ∘ proj₂)

_+⁺_ : ℚ⁺ → ℚ⁺ → ℚ⁺
_+⁺_ = undefined

-- the offending with-clause
+⁺-idˡ : ∀ q → (0#⁺ +⁺ q) ≡ q
+⁺-idˡ (rat⁺ n d c) with lcm (suc zero) (suc d)
...                | q = undefined

-- should succeed
