import models/SimpleClassDiagrams as SCD
include "primitives.alh"

SCD PetriNets{
    Class Natural {
        $
            if (bool_not(is_physical_int(self))):
                return "Natural has no integer value at " + name
            elif (integer_lt(self, 0)):
                return "Natural does not have a positive or zero value at " + name
            else:
                return "OK"
         $
    }
    Class Place{
        tokens : Natural {
            target_lower_cardinality = 1
            target_upper_cardinality = 1
            }
    }
    Class Transition{}
    Association P2T (Place, Transition) {
        weight : Natural {
            target_lower_cardinality = 1
            target_upper_cardinality = 1
            }
    }
    Association T2P (Transition, Place) {
        weight : Natural {
            target_lower_cardinality = 1
            target_upper_cardinality = 1
            }
    }
}

PetriNets valid_petrinet {
    Place p1 {
        tokens = 1
    }
    Place p2 {
        tokens = 3
    }
    Transition t1 {}
    P2T (p1, t1) {
        weight = 1
    }
    T2P (t1, p2) {
        weight = 2
    }
}

PetriNets invalid_petrinet_1 {
    Place p1 {
        tokens = -1
    }
    Place p2 {
        tokens = 3
    }
    Transition t1 {}
    P2T (p1, t1) {
        weight = 1
    }
    T2P (t1, p2) {
        weight = 2
    }
}

PetriNets invalid_petrinet_2 {
    Place p1 {
        tokens = 1
    }
    Place p2 {
        tokens = 3
    }
    Transition t1 {}
    P2T p2t(p1, t1) {
        weight = -1
    }
    T2P (t1, p2) {
        weight = 2
    }
}

PetriNets invalid_petrinet_3 {
    Place p1 {
        tokens = 1
    }
    Place p2 {
        tokens = 3
    }
    Transition t1 {}
    P2T wrong_p2t (p1, p2) {
        weight = 1
    }
    T2P (t1, p2) {
        weight = 2
    }
}

PetriNets invalid_petrinet_4 {
    Place p1 {
        tokens = 1
    }
    Place p2 {
        tokens = 3
    }
    Transition t1 {}
    P2T (p1, t1) {
        weight = 1
    }
    T2P wrong_t2p(p1, p2) {
        weight = 2
    }
}

PetriNets invalid_petrinet_5 {
    Place p1 {}
    Place p2 {
        tokens = 3
    }
    Transition t1 {}
    P2T (p1, t1) {
        weight = 1
    }
    T2P (t1, p2) {
        weight = 2
    }
}

PetriNets invalid_petrinet_6 {
    Place p1 {
        tokens = 1
    }
    Place p2 {
        tokens = 3
    }
    Transition t1 {}
    P2T p2t (p1, t1) {}
    T2P (t1, p2) {
        weight = 2
    }
}

PetriNets invalid_petrinet_7 {
    Place p1 {
        tokens = "abc"
    }
    Place p2 {
        tokens = 3
    }
    Transition t1 {}
    P2T (p1, t1) {}
    T2P (t1, p2) {
        weight = 2
    }
}

export PetriNets to models/PetriNets
export valid_petrinet to models/valid_petrinet
export invalid_petrinet_1 to models/invalid_petrinet_1
export invalid_petrinet_2 to models/invalid_petrinet_2
export invalid_petrinet_3 to models/invalid_petrinet_3
export invalid_petrinet_4 to models/invalid_petrinet_4
export invalid_petrinet_5 to models/invalid_petrinet_5
export invalid_petrinet_6 to models/invalid_petrinet_6
export invalid_petrinet_7 to models/invalid_petrinet_7
