# Blatt 9 Lukas Bruns Robin Faeseke Aufgabe 1 ```plantuml skinparam shadowing false hide circle skinparam classAttributeIconSize 0 skinparam class { BackgroundColor white ArrowColor black BorderColor black } class Main{ + main(args:String[]): void + start(primaryStage: Stage): void } class Model{ -a: int -b: int -c: int -result: String +getSide(sideName:String):int +setSide(sideName: String, side: int): void +allSidesSet(): boolean +getResult(): String +setResult(): void } class Controller{ - cli :CLI - model:Model - gui :GUI +Controller(stage: Stage) +updateView(view: String, side: String, sideValue:int): void +updateResults(): void +updateModel(view: String, side: String, sideValue: int): void } class CLI{ +updateValue(sideName:String, sideValue: int):void +awaitInput(controller: Controller):void +updateResult(result: String): void } class GUI{ -a: TextField -b: TextField -c: TextField -prevent: boolean -result: Text +updateValue(name: String, value: int): void +updateResult(s: String): void +display(stage: Stage, controller: Controller): void } GUI --> Controller Controller --> Model CLI --> Controller ``` Aufgabe 2 1. ```plantuml skinparam shadowing false skinparam object { BackgroundColor white ArrowColor black BorderColor black } object "<u>phi1: And" as and object "<u>: Not " as not object "<u>: Variable" as a{ name ="a" } object "<u>: Variable" as b{ name ="b" } and -- b: rhs and -- not: expr not -- a: lhs ``` 2. phi2 = ¬(¬(p∧q)∧¬r) Expression phi2 = new Not(new And(new Not(new And(new Variable("p"), new Variable("q"))), new Not(new Variable("r")))) phi3 = ¬(a∧(¬b∧b)) Expression phi3 = new Not(new And(new Variable("a")),new And(new Not(new Variable("b")),"b")) 3. ```plantuml hide circle skinparam shadowing false skinparam classAttributeIconSize 0 skinparam class { BackgroundColor white ArrowColor black BorderColor black } interface ExpressionVisitor <<interface>>{ + visitAnd(T t): T + visitNot(T t): T + visitVariable(T t): T } interface Expression <<interface>>{ + accept(ExpressionVisitor<T> visitor): T } class And implements Expression { + <<create>> And(lhs: Expression, rhs: Expression) + visitAnd(And and): T + accept(ExpressionVisitor<T> visitor): T } And *--> Expression: " ~lhs" And *--> Expression: " ~rhs" class Not implements Expression{ <<create>> Not(expr: Expression) + visitNot(Not not): T + accept(ExpressionVisitor<T> visitor): T } Not *--> Expression: " ~expr" class Variable implements Expression { + <<create>> Variable(name: String) ~ name: String + visitVariable(Variable variable): T + accept(ExpressionVisitor<T> visitor): T } class Printer implements ExpressionVisitor{ + {static} print(Expression expr): String } Printer *--> Expression:"expr" class Evaluator implements ExpressionVisitor{ - world: String[] + <<create>> Evaluator(Set<String>: world) + {static} evaluate(Expression: expr, Set<String>: world) } Evaluator *--> Expression:"expr" ``` 4. ```plantuml skinparam shadowing false hide footbox skinparam sequence { ArrowColor black ActorBorderColor black LifeLineBorderColor black ParticipantBorderColor black ParticipantBackgroundColor white ActorBackgroundColor white } participant "phi1: And" as and participant "not: Not" as not participant "a: Variable" as a participant "b: Variable" as b participant "evaluator: Evaluator" as eval participant "Evaluator" as Eval activate and and -->> a **: Variable("a") activate a and -->> not **: Not() a --> not ++: Not() not -->> and :lhs deactivate not and -->> b **: Variable("b") activate b b -->> and : rhs activate not not ->> Eval ++: Evaluator("a") deactivate not b ->> Eval : Evaluator ("b") Eval -->> eval **: evaluate (phi,world) activate eval deactivate and deactivate a deactivate b ``` Das Visitor-Pattern wird hier angewandt, indem die Klasse Evaluator das interface ExpressionVisitor implementiert und die Methode evaluate dann eine Instanz der Klasse Evaluator anlegt und die an die Methode accept von expr übergibt. Aufgabe 3 1. Das Petri-Netz ist nicht lebendig, da beispielsweise in s4 alle Tokens liegen und nur t4 aktiv ist alle Tokens in s3 wandern und somit t3 nicht schalten kann, weil keine Tokens in s2 liegen. Damit bleibt der Vorgang stehen. 2. Es hat eine Verklemmung, da die Begründung aus 1 gilt. 3. Der Erreichbarkeitsgraph ist nicht unendlich groß, da das Petri-Netz nicht lebendig ist, damit gibt es auch ein Ende.