from functools import reduce # Gegebene Funktionen aus der Aufgabe def is_clear(state, block): return all([v != block for v in state.values()]) def move(block, target): def action(state): if not is_clear(state, block): raise ValueError(f"Auf Block {block} liegt etwas!") if target != "_" and not is_clear(state, target): raise ValueError(f"Block {target} ist nicht frei!") new_state = state.copy() new_state[block] = target return new_state return action def chain(f, g): return lambda state: g(f(state)) if __name__ == '__main__': # Ausgangs- und Zielzustand der Aufgabe start = {"A": "B", "B": "_", "C": "_", "D": "C"} goal = {"A": "_", "B": "C", "C": "_", "D": "B"} # Liste der Aktionen in korrekter Reihenfolge actions = [ move("A", "_"), move("D", "_"), move("B", "C"), move("D", "B") ] # Originalzustand für den späteren Unverändertbarkeits-Check sichern start_copy = start.copy() # 1. Plan aus der Liste mit reduce erzeugen (Startwert ist die neutrale Funktion) plan = reduce(chain, actions, lambda state: state) # 2. Plan auf den Startzustand anwenden final_state = plan(start) print("Final state:", final_state) # Prüfen, ob das Ziel erreicht wurde assert final_state == goal, "Das Ziel wurde nicht erreicht!" # 3. Prüfen, ob der Startzustand durch die rein funktionale Arbeitsweise unverändert geblieben ist assert start == start_copy, "Der Startzustand wurde modifiziert (Seiteneffekt)!" print("Erfolgreich! Zielzustand erreicht und Startzustand blieb intakt.")