namespace http://mathhub.info/MitM/Foundation/Units 

import rules scala://rules.mitm.mmt.kwarc.info 

theory Dimensions : ur:?LF = 

  /T An SI Dimension. ❙
  dimension : type
  
  include ☞http://mathhub.info/MitM/Foundation?IntLiterals 
  
  /T A normalized representation used for equality reasoning etc. ❙
  NormedDimension : ℤ ⟶ ℤ ⟶ ℤ ⟶ ℤ ⟶ ℤ ⟶ ℤ ⟶ ℤ ⟶ dimension 

  /T We want the actual dimensions as a dimension. ❙
  /T We use the SI base dimensions for this. ❙
  Length : dimension  // = NormedDimension 1 0 0 0 0 0 0
  Time : dimension // = NormedDimension 0 1 0 0 0 0 0
  Mass : dimension // = NormedDimension 0 0 1 0 0 0 0
  Amount : dimension // = NormedDimension 0 0 0 1 0 0 0
  Temperature : dimension // = NormedDimension 0 0 0 0 1 0 0
  Current : dimension // = NormedDimension 0 0 0 0 0 1 0
  LuminousIntensity : dimension // = NormedDimension 0 0 0 0 0 0 1 
  DimNone : dimension // = NormedDimension 0 0 0 0 0 0 0 

  /T Now we want to make even more dimensions. ❙
  DimTimes: dimension ⟶ dimension ⟶ dimension  # 1 *' 2 
  DimDiv: dimension ⟶ dimension ⟶ dimension  # 1 /' 2 
  
  rule rules?DimEq 


theory DimensionsExtended : ur:?LF =
  include ?Dimensions

  // Dimensionless stuff❙
  Information : dimension = DimNone

  // Velocity, Accelleration ❙
  Velocity : dimension = Length /' Time
  Acceleration : dimension = Velocity /' Time

  // Area and Volume❙
  Area : dimension = Length *' Length
  Volume : dimension = Area *' Length
  
  // Densities ❙
  VolumeDensity : dimension = DimNone /' Volume   // # Density //?? 
  AreaDensity : dimension = DimNone /' Area
  LineDensity : dimension = DimNone /' Length

  // Force and Pressure❙                   
  Force : dimension = Mass *' Acceleration
  Pressure : dimension = Force /' Area

  // Electric Charge and Charge Densities❙
  ElectricCharge : dimension = Current *' Time 
  ElectricChargeVolumeDensity : dimension = ElectricCharge *' VolumeDensity  # ElectricChargeDensity
  ElectricChargeAreaDensity : dimension = ElectricCharge *' AreaDensity  # ElectricChargeSurfaceDensity
  ElectricChargeLineDensity : dimension = ElectricCharge *' LineDensity
  
  // Energy and Power❙
  Energy : dimension = Force *' Length 
  Power : dimension = Energy /' Time
  
  // Basic Electrostatic Units❙
  ElectricPotential : dimension = Energy /' ElectricCharge  # Voltage
  ElectricDisplacement : dimension  = ElectricCharge /' Area  
  ElectricCurrentDensity : dimension = Current *' AreaDensity  # Polarization  // # CurrentDensity 
  ElectricField : dimension  = Voltage /' Length  # ElectricFieldIntensity 
  
  // Other Electrical Units❙
  ElectricalResistance : dimension  = Voltage /' Current 
  ElectricalResistivity : dimension  = ElectricalResistance *' Area /' Length 
  ElectricalConductivity : dimension  = DimNone /' ElectricalResistivity  
  ElectricFlux : dimension  = Voltage *' Length  
  ElectricalCapacitance : dimension  = ElectricCharge /' Voltage 
  ElectricalPermittivity : dimension  = ElectricalCapacitance /' Length 
  ElectricalMobility : dimension  = Velocity /' ElectricField 
  
  IonRecombination : dimension  = Volume /' Time 

  // Magnetism // Hoping we don't need that for now
  
  // Heat-related , cf. Thermistor example❙
  Heat : dimension  = Energy  
	// ThermalConductivity : dimension ❘ = Energy /' Length /' Temperature ❙ // TODO Name clash with quantities.mmt ❙
	ThermalHeatFlux : dimension  = Energy /' Area