1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- include "primitives.alh"
- include "modelling.alh"
- include "object_operations.alh"
- Boolean function bfs(model : Element):
- String initial
- Element options
- Element worklist
- Element work_unit
- String state
- Element path
- Element path_copy
- String option
- Element visited
- String dest
- Integer total_states
- total_states = set_len(allInstances(model, "ReachabilityGraph/State"))
- worklist = list_create()
- visited = set_create()
- initial = set_pop(allInstances(model, "ReachabilityGraph/InitialState"))
- list_append(worklist, create_tuple(initial, dict_create()))
- set_add(visited, initial)
- while (list_len(worklist) > 0):
- work_unit = list_pop(worklist, 0)
- state = work_unit[0]
- path = work_unit[1]
- if (set_len(visited) == total_states):
- log("No error path found!")
- break!
- if (value_eq(read_attribute(model, state, "error"), True)):
- // Found an error path!
- log("Found error path!")
- log(list_to_string(path))
-
- Integer i
- i = 0
- while (i < list_len(path)):
- output(list_read(path, i))
- i = i + 1
- break!
- options = allOutgoingAssociationInstances(model, state, "ReachabilityGraph/Transition")
- while (set_len(options) > 0):
- option = set_pop(options)
- dest = readAssociationDestination(model, option)
- if (set_in(visited, dest)):
- continue!
- else:
- path_copy = dict_copy(path)
- list_append(path_copy, read_attribute(model, option, "name"))
- list_append(worklist, create_tuple(dest, path_copy))
- set_add(visited, dest)
- return True!
|