1 % (c) 2018 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
6 :- module(tools_matching,
7 [fuzzy_match_codes_lower_case/2,
8 fuzzy_match_codes/2,
9 codes_to_lower_case/2,
10 get_current_keywords/1
11 ]).
12
13 :- use_module(error_manager).
14 :- use_module(self_check).
15 :- use_module(library(lists)).
16
17 :- use_module(module_information).
18
19 :- module_info(group,infrastructure).
20 :- module_info(description,'A few utilities for fuzzy matching and completion.').
21
22
23
24 :- assert_must_succeed(tools_matching:fuzzy_match_codes_lower_case("a","A")).
25 :- assert_must_succeed(tools_matching:fuzzy_match_codes_lower_case("aBcD","ABCd")).
26 :- assert_must_succeed(tools_matching:fuzzy_match_codes_lower_case("aBcD","ABxCd")).
27 :- assert_must_succeed(tools_matching:fuzzy_match_codes_lower_case("aBxcD","ABCd")).
28 :- assert_must_succeed(tools_matching:fuzzy_match_codes_lower_case("aBcD","ABCdx")).
29 :- assert_must_succeed(tools_matching:fuzzy_match_codes_lower_case("aBcDx","ABCd")).
30 :- assert_must_succeed(tools_matching:fuzzy_match_codes_lower_case("a_Bc_D","AB__Cd")).
31 :- assert_must_fail(tools_matching:fuzzy_match_codes_lower_case("abc","cba")).
32
33
34 fuzzy_match_codes_lower_case(Codes1,Codes2) :-
35 codes_to_lower_case(Codes1,LCodes1),
36 codes_to_lower_case(Codes2,LCodes2),
37 fuzzy_match_codes(LCodes1,LCodes2).
38
39 :- assert_must_succeed(tools_matching:fuzzy_match_codes("aBcD","aBcD")).
40 :- assert_must_succeed(tools_matching:fuzzy_match_codes("aBxcD","aBcD")).
41 :- assert_must_succeed(tools_matching:fuzzy_match_codes("aBcD","aBcxD")).
42 :- assert_must_succeed(tools_matching:fuzzy_match_codes("aBcD","aBcDx")).
43 :- assert_must_succeed(tools_matching:fuzzy_match_codes("xaBcD","aBcD")).
44 :- assert_must_succeed(tools_matching:fuzzy_match_codes("aBcD","xaBcD")).
45 :- assert_must_fail(tools_matching:fuzzy_match_codes("abc","ABC")).
46
47 fuzzy_match_codes([],[]).
48 fuzzy_match_codes([H|T1],[H|T2]) :- !,fuzzy_match_codes(T1,T2).
49 fuzzy_match_codes([_|T],[_|T]) :- !. % one character rewritten
50 fuzzy_match_codes([H1|T1],L2) :- possible_skip_char(H1),!,fuzzy_match_codes(T1,L2).
51 fuzzy_match_codes(L1,[H2|T2]) :- possible_skip_char(H2),!,fuzzy_match_codes(L1,T2).
52 fuzzy_match_codes([_|T],T) :- !. % one character too much
53 fuzzy_match_codes(T,[_|T]) :- !. % one character too few
54
55 codes_to_lower_case(Codes,LC) :- maplist(code_to_lower_case,Codes,LC).
56
57 code_to_lower_case(Char,LC_Char) :- Char >= 65, Char =< 90,!, LC_Char is Char+32.
58 code_to_lower_case(C,C).
59
60 possible_skip_char(95). % _
61
62 :- use_module(specfile,[b_mode/0, animation_minor_mode/1]).
63
64 get_current_keywords(List) :- b_mode,!,
65 (animation_minor_mode(Minor) -> Mode=Minor ; Mode=b),
66 get_keywords(Mode,[expr,predicate],List).
67 get_current_keywords([]). % TO DO: support csp mode
68
69 get_keywords(Mode,Types,List) :-
70 findall(ID,(keyword(ID,Type,Modes), member(Mode,Modes), member(Type,Types)),Ids),
71 sort(Ids,List).
72
73 % list of language specific and context specific keywords
74 keyword(not,predicate,[b,eventb]).
75 keyword(or,predicate,[b,eventb]).
76 keyword('TRUE',expr,[b,eventb]).
77 keyword('FALSE',expr,[b,eventb]).
78 keyword('BOOL',expr,[b,eventb]).
79 keyword('bool',expr,[b,eventb]).
80 keyword('POW',expr,[b,eventb]).
81 keyword('POW1',expr,[b,eventb]).
82 keyword('FIN',expr,[b,eventb]).
83 keyword('FIN1',expr,[b,eventb]).
84 keyword('union',expr,[b,eventb]).
85 keyword('inter',expr,[b,eventb]).
86 keyword('UNION',expr,[b,eventb]).
87 keyword('INTER',expr,[b,eventb]).
88 keyword('INTEGER',expr,[b]).
89 keyword('NATURAL',expr,[b]).
90 keyword('NATURAL1',expr,[b]).
91 keyword('INT',expr,[b,eventb]).
92 keyword('NAT',expr,[b,eventb]).
93 keyword('NAT1',expr,[b,eventb]).
94 keyword('MININT',expr,[b]).
95 keyword('MAXINT',expr,[b]).
96 keyword('min',expr,[b,eventb]).
97 keyword('max',expr,[b,eventb]).
98 keyword('SIGMA',expr,[b]).
99 keyword('PI',expr,[b]).
100 keyword('dom',expr,[b,eventb]).
101 keyword('ran',expr,[b,eventb]).
102 keyword('id',expr,[b,eventb]).
103 keyword('prj1',expr,[b,eventb]).
104 keyword('prj2',expr,[b,eventb]).
105 keyword('pred',expr,[b,eventb]).
106 keyword('succ',expr,[b,eventb]).
107 keyword('closure',expr,[b]).
108 keyword('closure1',expr,[b]).
109 keyword('iterate',expr,[b]).
110 keyword('fnc',expr,[b]). % also Event-B ?
111 keyword('rel',expr,[b]).
112
113 keyword('seq',expr,[b]).
114 keyword('seq1',expr,[b]).
115 keyword('iseq',expr,[b]).
116 keyword('iseq1',expr,[b]).
117 keyword('perm',expr,[b]).
118 keyword('size',expr,[b]).
119 keyword('rev',expr,[b]).
120 keyword('first',expr,[b]).
121 keyword('last',expr,[b]).
122 keyword('front',expr,[b]).
123 keyword('tail',expr,[b]).
124 keyword('conc',expr,[b]).
125 keyword('struct',expr,[b]).
126 keyword('rec',expr,[b]).
127 keyword('STRING',expr,[b]).
128
129 keyword('skip',subst,[b]).
130 keyword('CASE',subst,[b]).
131 keyword('SELECT',subst,[b]).
132 keyword('PRE',subst,[b]).
133
134 keyword('IF',_,[b]).
135 keyword('THEN',_,[b]).
136 keyword('ELSE',_,[b]).
137 keyword('LET',_,[b]).
138 keyword('BE',_,[b]).
139 keyword('END',_,[b]).
140
141 % TO DO: add keywords for TLA, Z minor modes