1 % (c) 2019-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(kernel_lists,[ not_element_of_list_wf/3
6 %, element_of_list_wf/4 % code not used
7 ]).
8
9 :- use_module(module_information,[module_info/2]).
10 :- module_info(group,kernel).
11 :- module_info(description,'This module provides operations for lists of B objects.').
12 % with possible repetitions, as, e.g., for set_extensions
13
14 :- use_module(kernel_objects,[not_equal_object_wf/3]).
15 :- use_module(error_manager).
16
17 not_element_of_list_wf(Element,List,WF) :- not_el_wf(List,Element,WF).
18
19 :- block not_el_wf(-,?,?).
20 not_el_wf([],_,_WF) :- !.
21 not_el_wf([H|T],X,WF) :- !,
22 not_equal_object_wf(H,X,WF),
23 not_el_wf(T,X,WF).
24 not_el_wf(Other,X,WF) :-
25 add_internal_error('Not a list: ',not_el_wf(Other,X,WF)),fail.
26
27 % Questions: does it make sense to call clpfd_interface:clpfd_not_inlist ?
28
29
30
31 % test code below with: i1=1 & j1:0..6 & mid1:0..7 & mid2 : {mid1/2, mid1}
32 % code not used at the moment, so commented out
33
34 /*
35 :- use_module(kernel_mappings,[kernel_call/4,kernel_call_predicate_check_element_of_wf/4]).
36 :- use_module(clpfd_lists,[try_in_fd_value_list_check/4]).
37 :- use_module(preferences,[get_preference/2]).
38
39 element_of_list_wf(ElementVal,TypeOfElement,List,WF) :-
40 % temporary solution: use code from interpreter to evaluate set_extension:
41 kernel_call(b_interpreter:convert_list_of_expressions_into_set_wf(List,ValueSet,set(TypeOfElement),WF),
42 List,WF, set_extension(List)), % do we need real AST Expression ? List contains values
43 % temporary solution: use check_element_of_wf; to do: use custom version just for lists
44 kernel_call_predicate_check_element_of_wf(ElementVal,ValueSet,WF,unknown),
45 %print_term_summary(prop(ExValue,ElementVal,WF)),nl,
46 % TO DO: avoid calling check_element_of version when CLPFD complete check possible
47 (get_preference(use_clpfd_solver,false) -> true
48 ; get_fd_type_from_b_type(TypeOfElement,FDType),
49 try_in_fd_value_list_check(List,ElementVal,FDType,WF)
50 % TO DO: provide cleaner API for this
51 ),
52 tools_printing:print_term_summary(finished_element_of_list_wf(ElementVal,List)),nl.
53
54 get_fd_type_from_b_type(integer,T) :- !, T=integer.
55 get_fd_type_from_b_type(global(G),T) :- !, T=global(G).
56 get_fd_type_from_b_type(_,_). % otherwise type could be couple_left,...
57
58 */