| 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(dependence,[schema_dependence/2]). | |
| 6 | ||
| 7 | :- use_module(library(lists)). | |
| 8 | :- use_module(probsrc(tools)). | |
| 9 | :- use_module(z_tools). | |
| 10 | ||
| 11 | :- use_module(probsrc(module_information)). | |
| 12 | :- module_info(group,proz). | |
| 13 | :- module_info(description,'This module provides a predicate to find dependencies between Z schemas'). | |
| 14 | ||
| 15 | schema_dependence(Def,Dependencies) :- | |
| 16 | extract_schemas(Def,Names,Bodies), | |
| 17 | schema_dependence2(Names,Bodies,Dependencies1), | |
| 18 | check_abbreviations(Def,Dependencies1,Dependencies). | |
| 19 | schema_dependence2([],_,[]). | |
| 20 | schema_dependence2([Id|NRest],[Body|BRest],Deps) :- | |
| 21 | schemadeps(Id,Body,Deps1), | |
| 22 | append(Deps1,Deps2,Deps), | |
| 23 | schema_dependence2(NRest,BRest,Deps2). | |
| 24 | ||
| 25 | extract_schemas([],[],[]) :- !. | |
| 26 | extract_schemas([sdef(shead(Name,_),Body)|Rest], [Name|NRest],[Body|BRest]) :- | |
| 27 | !,extract_schemas(Rest,NRest,BRest). | |
| 28 | extract_schemas([defeq(shead(Name,_),Body)|Rest], [Name|NRest],[Body|BRest]) :- | |
| 29 | !,extract_schemas(Rest,NRest,BRest). | |
| 30 | extract_schemas([_|Rest],NRest,BRest) :- extract_schemas(Rest,NRest,BRest). | |
| 31 | ||
| 32 | check_abbreviations([],D,D) :- !. | |
| 33 | check_abbreviations([eqeq(lhs(name(Id,''),_),Body)|Rest],Deps,Result) :- | |
| 34 | member(dep(_,Id),Deps), | |
| 35 | !, | |
| 36 | schemadeps(Id,Body,Deps1), | |
| 37 | append(Deps,Deps1,NewDeps), | |
| 38 | check_abbreviations(Rest,NewDeps,Result). | |
| 39 | check_abbreviations([_|Rest],Deps,Result) :- check_abbreviations(Rest,Deps,Result). | |
| 40 | ||
| 41 | schemadeps(Id,Body,Deps) :- | |
| 42 | sdep(Body,LDeps), | |
| 43 | findall(dep(Id,D),member(D,LDeps),Deps). | |
| 44 | ||
| 45 | sdep([],[]). | |
| 46 | sdep([S|Rest],Deps) :- | |
| 47 | sdep(S,Deps1), | |
| 48 | sdep(Rest,Deps2), | |
| 49 | append_not_duplicate(Deps1,Deps2,Deps). | |
| 50 | sdep(sref(Id,_,_,_),[Id]). | |
| 51 | sdep(sand(A,B),Deps) :- sdep([A,B],Deps). | |
| 52 | sdep(sor(A,B),Deps) :- sdep([A,B],Deps). | |
| 53 | sdep(simplies(A,B),Deps) :- sdep([A,B],Deps). | |
| 54 | sdep(sequiv(A,B),Deps) :- sdep([A,B],Deps). | |
| 55 | sdep(snot(A),Deps) :- sdep(A,Deps). | |
| 56 | sdep(fatsemi(A,B),Deps) :- sdep([A,B],Deps). | |
| 57 | sdep(sforall(A,B),Deps) :- sdep([A,B],Deps). | |
| 58 | sdep(sexists(A,B),Deps) :- sdep([A,B],Deps). | |
| 59 | sdep(sexists1(A,B),Deps) :- sdep([A,B],Deps). | |
| 60 | sdep(hide(S,_),Deps) :- sdep(S,Deps). | |
| 61 | sdep(project(A,B),Deps) :- sdep([A,B],Deps). | |
| 62 | sdep(pre(S),Deps) :- sdep(S,Deps). | |
| 63 | sdep(pipe(A,B),Deps) :- sdep([A,B],Deps). | |
| 64 | ||
| 65 | sdep(body(Decls,_),Deps) :- sdep(Decls,Deps). | |
| 66 | sdep(text(S),Deps) :- sdep(S,Deps). | |
| 67 | sdep(decl(_,_),[]). | |
| 68 | sdep(sdecl(S),Deps) :- sdep(S,Deps). | |
| 69 |