(load-file "general-alloy-lemmas.ath")

(define lemma-1 "ALL n x | [n x] in data ==> (ALL S | elms({[n]},S) ==> [x] in S)")

(!pf lemma-1 [scalar-lemma elms-semantics union-axiom])

(define ind-lemma "ALL k m n x S | [n m] in next^k & [m x] in data & elms({[n]},S) ==> [x] in S")

(define (goal k) (forall ?m ?n ?x ?S "[n m] in next^k & [m x] in data & elms({[n]},S) ==> [x] in S"))

(by-induction-on ?k (goal ?k)
  (zero (!pf (goal zero) [lemma-1 pow-axiom-1 id-axiom]))
  ((succ k) (pick-any m n x S
	      (assume-let ((hyp "[n m] in next^k+1 & [m x] in data & elms({[n]},S)"))
                (dlet ((P (!pf "EXISTS z S' | [n z] in next & [z m] in next^k & elms({[z]},S') & S = S' union {[n]}.data" 
	                    [hyp elms-semantics next-is-partial-fun empty-axiom scalar-lemma  pow-axiom-2])))
		  (!pf "[x] in S" [P hyp (goal k) union-axiom]))))))
;scalar-lemma

(define Elms-Soundness "ALL n S | elms({[n]},S) ==> ({[n]}.next*).data subset S")

(Elms-Soundness BY 
  (pick-any n S
    (assume-let ((hyp "elms({[n]},S)"))
      (!prove-subsets  (sbdot (sbdot (scalar n) (rtc next)) data) S
         [hyp elms-semantics star-pow-lemma sbdot-axiom scalar-lemma ind-lemma]))))

;===============================  COMPLETENESS ==========================


