(load-file "util.ath")

(domain (Set-Of T))

(declare in ((T) -> (T (Set-Of T)) Boolean))

(declare empty ((T) -> ((Set-Of T)) Boolean))

(declare null ((T) (Set-Of T)))

(define null-axiom (forall ?x (not (in ?x null))))

(define empty-axiom
  (forall ?s
    (iff (empty ?s)
      (forall ?x (not (in ?x ?s))))))


(assert empty-axiom)


(declare singl ((T) -> (T) (Set-Of T)))

(define singleton-axiom
  (forall ?x
    (forall ?y 
      (iff (in ?x (singl ?y))
	   (= ?x ?y)))))

(define singleton-axiom-1
  (forall ?x (in ?x (singl ?x))))

(assert singleton-axiom singleton-axiom-1)

(define singleton-hc-1 
  (forall* [?x ?y]
   (if (= ?x ?y)
       (in ?x (singl ?y)))))

(assert singleton-hc-1)

(declare is-singleton ((T) -> ((Set-Of T)) Boolean))

(define is-singleton-axiom
  (forall ?s
    (iff (is-singleton ?s)
	 (exists ?x (= ?s (singl ?x))))))

(assert is-singleton-axiom)            

(declare insert ((T) -> (T (Set-Of T)) (Set-Of T)))

(define insert-axiom1
  (forall ?e ?s
    (in ?e (insert ?e ?s))))

(define insert-axiom2
  (forall ?e ?e' ?s
    (if (in ?e' ?s)
        (in ?e' (insert ?e ?s)))))

(assert insert-axiom1 insert-axiom2)

(declare subset ((T) -> ((Set-Of T) (Set-Of T)) Boolean))

(define subset-axiom 
  (forall ?s1
    (forall ?s2
      (iff (subset ?s1 ?s2)
           (forall ?x
             (if (in ?x ?s1)
                 (in ?x ?s2)))))))

(assert subset-axiom)

(define ext-axiom
  (forall ?s1
    (forall ?s2
      (iff (= ?s1 ?s2)
	   (forall ?x
	     (iff (in ?x ?s1)
		  (in ?x ?s2)))))))

(assert ext-axiom)

(define set-equality
  (forall ?s1 ?s2
    (iff (= ?s1 ?s2)
	 (and (subset ?s1 ?s2) (subset ?s2 ?s1)))))

; darko commented out so that he can run this file from his account
; (!pf set-equality [ext-axiom subset-axiom])

(declare union ((T) -> ((Set-Of T) (Set-Of T)) (Set-Of T)))

(declare intersection ((T) -> ((Set-Of T) (Set-Of T)) (Set-Of T)))

(define union-axiom
  (forall ?s1 
    (forall ?s2
      (forall ?x
        (iff (in ?x (union ?s1 ?s2))
             (or (in ?x ?s1)
                 (in ?x ?s2)))))))

(assert union-axiom)

(define union-hc-1
  (forall* [?s1 ?s2 ?x]
    (if (in ?x ?s1)
	(in ?x (union ?s1 ?s2)))))

(define union-hc-2
  (forall* [?s1 ?s2 ?x]
    (if (in ?x ?s2)
	(in ?x (union ?s1 ?s2)))))

(assert union-hc-1 union-hc-2)
