1 % (c) 2009 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(schemavars,[schema_vars/3,schema_vars_decl/3]).
6
7 :- use_module(library(lists)).
8
9 :- use_module(probsrc(tools)).
10
11 :- use_module(z_tools).
12 :- use_module(zenvironment).
13
14 :- use_module(probsrc(module_information)).
15 :- module_info(group,proz).
16 :- module_info(description,'This module contains code to extract the variables declared and visible in a schema declaration').
17
18 %********************************************************************************
19 % extract vars from declaration
20
21 schema_vars(sref(Name,Deco,_,Renamings),Env,Vars) :-
22 zlookup_schema(Env,Name,_,Expr),
23 schema_vars(Expr,Env,Vars1),
24 decorate_vars(Vars1,Deco,DVars),
25 rename(DVars,Renamings,Vars).
26
27 schema_vars(sand(A,B),Env,Vars) :- schema_vars_logbin(A,B,Env,Vars).
28 schema_vars(sor(A,B),Env,Vars) :- schema_vars_logbin(A,B,Env,Vars).
29 schema_vars(simplies(A,B),Env,Vars) :- schema_vars_logbin(A,B,Env,Vars).
30 schema_vars(sequiv(A,B),Env,Vars) :- schema_vars_logbin(A,B,Env,Vars).
31 schema_vars(snot(A),Env,Vars) :- schema_vars(A,Env,Vars).
32 schema_vars(sforall(B,S),Env,Vars) :- schema_vars_quantifier(B,S,Env,Vars).
33 schema_vars(sexists(B,S),Env,Vars) :- schema_vars_quantifier(B,S,Env,Vars).
34 schema_vars(sexists1(B,S),Env,Vars) :- schema_vars_quantifier(B,S,Env,Vars).
35 schema_vars(hide(S,Hide),Env,Vars) :-
36 schema_vars(S,Env,All),remove_all(All,Hide,Vars).
37
38 schema_vars(fatsemi(A,B),Env,Vars) :-
39 schema_vars(A,Env,AVars),
40 findall(name(Name,'\''),member(name(Name,'\''),AVars),InterA),
41 remove_all(AVars,InterA,Aall),
42
43 schema_vars(B,Env,BVars),
44 findall(name(Name,''),member(name(Name,''),BVars),InterB),
45 remove_all(BVars,InterB,Ball),
46
47 append_not_duplicate(Aall,Ball,Vars).
48 schema_vars(project(_,B),Env,Vars) :- schema_vars(B,Env,Vars).
49 schema_vars(pre(Schema),Env,Vars) :-
50 schema_vars(Schema,Env,AllVars),
51 findall(name(Name,Deco),
52 (member(name(Name,Deco),AllVars), \+ member(Deco,['\'','!'])),
53 Vars).
54 schema_vars(pipe(A,B),Env,Vars) :-
55 schema_vars(A,Env,AVars),
56 schema_vars(B,Env,BVars),
57 findall(name(Name,'!'),
58 (member(name(Name,'!'),AVars),member(name(Name,'?'),BVars)),
59 Out),
60 findall(name(Name,'?'),member(name(Name,'!'),Out),In),
61 remove_all(AVars,Out,AwoO),
62 remove_all(BVars,In,BwoI),
63 append_not_duplicate(AwoO,BwoI,Vars).
64
65 schema_vars(text(Body),Env,Vars) :- schema_vars(Body,Env,Vars).
66 schema_vars(body(Decl,_),Env,Vars) :- schema_vars_decl(Decl,Env,Vars).
67
68 % Helper predicates
69
70 % vars of a schema binary logical expression
71 schema_vars_logbin(A,B,Env,Vars) :-
72 schema_vars(A,Env,AVars),
73 schema_vars(B,Env,BVars),
74 append_not_duplicate(AVars,BVars,Vars).
75
76 % vars of a schema quantifier expression
77 schema_vars_quantifier(Schema,Body,Env,Vars) :-
78 schema_vars(Body,Env,Hide),
79 schema_vars(hide(Schema,Hide),Env,Vars).
80
81 % vars of the declaration part of a body
82 schema_vars_decl(Decls,Env,Vars) :-
83 maplist(schema_vars_decl2(Env),Decls,LVars),
84 append(LVars,Vars).
85 schema_vars_decl2(_,decl(Vars,_),Vars).
86 schema_vars_decl2(Env,sdecl(Sexpr),Vars) :- schema_vars(Sexpr,Env,Vars).
87
88 % renames variables
89 rename([],_,[]).
90 rename([NameA|Rest],Renamings,[NameB|RenamedRest]) :-
91 (member(rename(NameB,NameA),Renamings) ->
92 true;
93 NameA = NameB),
94 rename(Rest,Renamings,RenamedRest).