1 % (c) 2015-2022 Lehrstuhl fuer Softwaretechnik und Programmiersprachen,
2 % Heinrich Heine Universitaet Duesseldorf
3 % This software is licenced under EPL 1.0 (http://www.eclipse.org/org/documents/epl-v10.html)
4
5 :- module(ce_replay,[replay_counter_example/1]).
6
7 :- use_module(probsrc(module_information)).
8 :- module_info(group,symbolic_model_checker).
9 :- module_info(description,'Replay symbolically generated traces.').
10
11 :- use_module(probsrc(state_space),[state_space_reset/0]).
12 :- use_module(probsrc(error_manager),[add_error/3]).
13
14 :- use_module(symbolic_model_checker(predicate_handling), [create_state_predicate/2,
15 create_constants_state_predicate/2,
16 deprime_state/2]).
17
18 :- use_module(probsrc(b_trace_checking),[find_successor_state/4]).
19 % Sol is a single state with potentially primed variables; unprimed variables are the first state,
20 % simply primed ones the second, doubly primed the third state, ...
21 replay_counter_example(Sol) :-
22 length(Sol,Len),format('Replaying counter example with ~w bindings found by symbolic model checker~n',[Len]),
23 state_space_reset,
24 ? (replay_aux(Sol,_) -> true
25 ; add_error(symbolic_model_checker,'Could not replay counter example: ',Sol)
26 ).
27
28 replay_aux(Sol,CurId) :-
29 ? create_constants_state_predicate(Sol,ConstantsStatePred), !,
30 find_successor_state(CurId,ConstantsStatePred,SuccID,0),
31 ? replay_aux2(Sol,SuccID,1).
32 replay_aux(Sol,CurId) :-
33 replay_aux2(Sol,CurId,1).
34
35 replay_aux2([],_,_) :- !.
36 replay_aux2(Sol,CurId,LineNr) :-
37 ? create_state_predicate(Sol,StatePred),
38 % print(find(CurId,LineNr,Sol)),nl, translate:print_bexpr(StatePred),nl,
39 find_successor_state(CurId,StatePred,SuccID,LineNr),
40 deprime_state(Sol,DPSol),
41 L1 is LineNr+1,
42 ? replay_aux2(DPSol,SuccID,L1).