| 1 | % (c) 2016 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_frozen_info,[kfi_domain/2, kfi_range/2]). | |
| 6 | ||
| 7 | :- use_module(module_information,[module_info/2]). | |
| 8 | :- module_info(group,kernel). | |
| 9 | :- module_info(description,'This module detects information about variables by using frozen.'). | |
| 10 | ||
| 11 | % light-weight CHR-style propagations | |
| 12 | % ideally we should rewrite this to use CHR itself or attributes | |
| 13 | % indeed, the code below is very limited: will find only one domain/range co-routine, | |
| 14 | % is quite brittle wrt the particular pending co-routine, may be expensive if lot of co-routines attached,... | |
| 15 | ||
| 16 | :- use_module(debug). | |
| 17 | ||
| 18 | kfi_domain(V,Domain) :- var(V), frozen(V,Frozen), | |
| 19 | attached_domain_info(Frozen,V,Domain), %print(attached(V,Domain)),nl,nl, | |
| 20 | debug_println(5,found_domain(V,Domain)). | |
| 21 | ||
| 22 | attached_domain_info((A,B),Var,Dom) :- | |
| 23 | (attached_domain_info(A,Var,R) -> Dom=R ; attached_domain_info(B,Var,Dom)). | |
| 24 | attached_domain_info(kernel_mappings:binary_in_kernel_call2(_Module,Pred,X,Arg1,Arg2,_WF,_WF0),Var,Dom) :- | |
| 25 | binary_in_domain(Pred,X,Arg1,Arg2,Var,Dom). | |
| 26 | ||
| 27 | ||
| 28 | % to do: add other infos/co-routines | |
| 29 | binary_in_domain(total_function_wf,X,TFDom,_TFRange,Var, Dom) :- Var==X, Dom=TFDom. | |
| 30 | binary_in_domain(total_injection_wf,X,TFDom,_TFRange,Var, Dom) :- Var==X, Dom=TFDom. | |
| 31 | binary_in_domain(total_surjection_wf,X,TFDom,_TFRange,Var, Dom) :- Var==X, Dom=TFDom. | |
| 32 | binary_in_domain(total_bijection_wf,X,TFDom,_TFRange,Var, Dom) :- Var==X, Dom=TFDom. | |
| 33 | binary_in_domain(total_relation_wf,X,TFDom,_TFRange,Var, Dom) :- Var==X, Dom=TFDom. | |
| 34 | binary_in_domain(total_surjection_relation_wf,X,TFDom,_TFRange,Var, Dom) :- Var==X, Dom=TFDom. | |
| 35 | ||
| 36 | % ------------ | |
| 37 | ||
| 38 | % TO DO: for surjections we can also do kfi_range(V,Range) | |
| 39 | ||
| 40 | kfi_range(V,Ran) :- var(V), frozen(V,Frozen), | |
| 41 | attached_range_info(Frozen,V,Ran), print(attached_range(V,Ran)),nl,nl,debug_println(5,found_range(V,Ran)). | |
| 42 | ||
| 43 | attached_range_info((A,B),Var,Ran) :- | |
| 44 | (attached_range_info(A,Var,R) -> Ran=R ; attached_range_info(B,Var,Ran)). | |
| 45 | attached_range_info(kernel_mappings:binary_in_kernel_call2(_Module,Pred,X,Arg1,Arg2,_WF,_WF0),Var,Ran) :- | |
| 46 | binary_in_range(Pred,X,Arg1,Arg2,Var,Ran). | |
| 47 | ||
| 48 | ||
| 49 | binary_in_range(total_surjection_wf,X,_TFDom,TFRange,Var, Ran) :- Var==X, Ran=TFRange. | |
| 50 | binary_in_range(total_bijection_wf,X,_TFDom,TFRange,Var, Ran) :- Var==X, Ran=TFRange. | |
| 51 | binary_in_range(total_surjection_relation_wf,X,_TFDom,TFRange,Var, Ran) :- Var==X, Ran=TFRange. | |
| 52 | binary_in_range(partial_surjection_wf,X,_TFDom,TFRange,Var, Ran) :- Var==X, Ran=TFRange. | |
| 53 | binary_in_range(surjection_relation_wf,X,_TFDom,TFRange,Var, Ran) :- Var==X, Ran=TFRange. |