1 | % (c) 2009-2024 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 | :- module(eval_interface, | |
5 | [ | |
6 | get_value_string_of_formula/5, | |
7 | b_compute_expression_no_wd/4 | |
8 | ||
9 | ] | |
10 | ). | |
11 | ||
12 | % TO DO: clean up API, and integrate parts form eval_strings and other modules | |
13 | ||
14 | :- use_module(probsrc(module_information),[module_info/2]). | |
15 | :- module_info(group,repl). | |
16 | :- module_info(description,'Utilities for evaluating formulas, predicates, expressions.'). | |
17 | ||
18 | %% | |
19 | % Evaluate predicate or expression ... at least it tries XD | |
20 | % Expressions return value is translated by pretty printer. | |
21 | % Value is unknown if Expr is neither a predicate or expression. | |
22 | % | |
23 | ||
24 | %% | |
25 | % Evaluate the predicate Expr in LocaleState and State. | |
26 | % It does check for consistency by checking Expr == !!Expr. | |
27 | % Thus it yields in addition to true and false also | |
28 | % x_both_true_and_not_true and undefined | |
29 | % as flag signaling internal errors. | |
30 | ||
31 | :- use_module(probsrc(error_manager)). | |
32 | :- use_module(probsrc(bsyntaxtree),[check_if_typed_predicate/1,check_if_typed_expression/1]). | |
33 | :- use_module(probsrc(preferences),[temporary_set_preference/3,reset_temporary_preference/2]). | |
34 | :- use_module(probsrc(translate), [translate_bvalue_with_limit/3]). | |
35 | ||
36 | % was x_get_value_of_expr | |
37 | ||
38 | % get_value_of_expression or predicate without wd errors: TO DO: move to another module | |
39 | get_value_string_of_formula(State, LocalState, Expr, _Lim, Value):- | |
40 | check_if_typed_predicate(Expr),!, | |
41 | temporary_set_preference(disprover_mode,false,CHNG), % avoid WD Errors, we detect WD issues by failure below | |
42 | temporary_set_preference(find_abort_values,false,CHNG2), | |
43 | % print('Test: '),translate:print_bexpr(Expr),nl, | |
44 | get_bool_expr_value(Expr,LocalState,State,Value), | |
45 | reset_temporary_preference(disprover_mode,CHNG), | |
46 | reset_temporary_preference(find_abort_values,CHNG2), | |
47 | clear_wd_errors. % ,print('Value: '), print(Value),nl. | |
48 | get_value_string_of_formula(State, LocalState, Expr, Lim, Value):- | |
49 | check_if_typed_expression(Expr),!, | |
50 | % print('Eval: '),translate:print_bexpr(Expr),nl, | |
51 | (b_compute_expression_no_wd(Expr, LocalState, State, Value0) | |
52 | -> translate_bvalue_with_limit(Value0, Lim, Value) % we show maximally 10 lines a 40 chars | |
53 | ; Value = unknown). | |
54 | get_value_string_of_formula(_State, _LocalState, _Expr, _, unknown). | |
55 | ||
56 | % (error(representation_error(max_clpfd_integer) | |
57 | ||
58 | :- use_module(probsrc(b_interpreter), [ | |
59 | b_test_boolean_expression_cs/5, | |
60 | b_not_test_boolean_expression_cs/5]). | |
61 | ||
62 | get_bool_expr_value(Expr,LocalState,State,Value) :- | |
63 | catch(get_bool_expr_val2(Expr,LocalState,State,Value), E, ( | |
64 | add_exception_warning('Exception in bvisual while evaluating predicate: ', E), | |
65 | Value=undefined | |
66 | )). | |
67 | get_bool_expr_val2(Expr,LocalState,State,Value) :- | |
68 | ( b_test_boolean_expression_cs(Expr,LocalState,State,'formula visualisation',0) -> | |
69 | ( b_not_test_boolean_expression_cs(Expr,LocalState,State,'formula visualisation (negated)',0) | |
70 | -> Value = x_both_true_and_not_true, % was x_unknown_true_and_not_true | |
71 | % we should add an error message here | |
72 | % this should never happen | |
73 | print('### Error, x_both_true_and_not_true: '), print(Expr),nl | |
74 | ; Value = true | |
75 | ) | |
76 | ; b_not_test_boolean_expression_cs(Expr,LocalState,State,'formula visualisation',0) -> | |
77 | Value = false | |
78 | %, print(value_false),nl | |
79 | ; | |
80 | Value = undefined % was x_undefined_false_and_not_false | |
81 | %, print(value_undefined),nl | |
82 | ). | |
83 | ||
84 | add_exception_warning(_,E) :- is_enumeration_warning_exception(E),!. | |
85 | add_exception_warning(Msg,E) :- | |
86 | add_warning(bvisual,Msg,E). | |
87 | ||
88 | :- use_module(probsrc(b_interpreter),[b_compute_expression_nowf/6]). | |
89 | ||
90 | b_compute_expression_no_wd(Fun, LocalState, State, FunValue) :- | |
91 | temporary_set_preference(disprover_mode,true,CHNG), % avoid WD Errors, we detect WD issues by failure below | |
92 | temporary_set_preference(find_abort_values,false,CHNG2), | |
93 | (catch( | |
94 | b_compute_expression_nowf(Fun, LocalState, State, FunValue,'formula visualisation',0), | |
95 | E, | |
96 | (add_exception_warning('Exception in bvisual while evaluating expression: ',E),fail) | |
97 | ) | |
98 | -> reset_temporary_preference(disprover_mode,CHNG), | |
99 | reset_temporary_preference(find_abort_values,CHNG2) | |
100 | ; reset_temporary_preference(disprover_mode,CHNG), | |
101 | reset_temporary_preference(find_abort_values,CHNG2), fail). | |
102 | ||
103 |