Module DupCapZeroWeight

Set Implicit Arguments.
Require Import MyTactics.
Require Import Layers.
Require Import RawPrograms.
Require Import Resources.
Require Import ResourcesContinued.
Require Import Environments.
Require Import Multiplicity.
Require Import Typing.
Require Import WellLayeredness.
Require Import InversionClassification.
Require Import Erasure.
Require Import ValueReductionTerminates.

A well-typed, duplicable, logical value has zero weight.

Lemma zero_plus_zero:
  forall n1 n2,
  n1 = 0 ->
  n2 = 0 ->
  n1 + n2 = 0.
Proof.
  intros; omega.
Qed.

Local Hint Resolve zero_plus_zero duplicable_own_region
duplicable_own_location duplicable_split_left duplicable_split_right
duplicable_neutral.

Lemma duplicable_capabilities_have_zero_weight:
  forall R v T,
  jv R nil nil v T ->
  duplicable R ->
  wlv nil v Logical ->
  weight v = 0.
Proof.
  introv h; dependent induction h; simpl; intros; try (nil; nilnil); wl_inversion; layers;
  try solve [ discriminate | omega | eauto 6 | false; eauto ].
Qed.