Я пытаюсь просмотреть график, который я построил в прологе. График представлен в виде списка переходов вида:
next (FromState, ToState, Symbol), где FromState и ToState - узлы графа, представленные в виде: state (Number, IrrelevantVariable). Символ может принимать много значений, но меня интересуют только переходы с эпсилоном в качестве символа. Учитывая группу StartStates, мне нужно посмотреть, какие переходы имеют FromState = StartState и Symbol = epsilon. Если эти два условия выполняются, я добавлю ToState в конец StartStates и добавлю FromState в список посещенных узлов. У меня проблемы с этим, и моя текущая программа по какой-то причине не работает. Есть идеи, почему это не работает? Одна из проблем заключается в том, что когда я использую предикат участника, чтобы увидеть, посетил ли я состояние в заголовке списка, оно заканчивается объединением, чтобы сделать предикат участника истинным, вместо того, чтобы фактически проверять Visited for Head при первом вызове espsilon_closure_helper3
epsilon_closure_helper3([], [Transitions], Visited).
epsilon_closure_helper3([Head|Tail], Transitions, Visited) :-
member(Head, Visited)
->
epsilon_closure_helper2(Tail, Transitions, Visited)
;
epsilon_closure_helper2(Head, Transitions, ClosureStates1),
append(Tail, ClosureStates1, Tail1),
sort(Tail1, Tail2),
append(Vistited, [Head], Visited1),
epsilon_closure_helper3(Tail2, Transitions, Visited1).
epsilon_closure_helper2(State, [], States) :-
States = [State].
epsilon_closure_helper2(State, Transitions, States) :-
Transitions = [Head|Tail],
epsilon_closure_helper2(State, Tail, States1),
Head = next(A, B, Symbol),
(
test_state(State, A, Symbol) -> append(States1, [B], States) ;
States = States1
).
test_state(TargetState, State, Symbol) :-
State = TargetState,
Symbol = epsilon.
Пример ввода:
epsilon_closure_helper3 ([состояние (0, iv)], [следующее (состояние (0, iv), состояние (1, iv), эпсилон), следующее (состояние (1, iv), состояние (2, iv), эпсилон] Посещено , Закрытие).
Выход:
Закрытие = [состояние (0, iv), состояние (1, iv), состояние (2, iv)]