| 1 | % (c) 2009-2017 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 | % This module is a version of the XTL interpreter as plugin | |
| 6 | ||
| 7 | :- module(xtl, [plugin_info/1]). | |
| 8 | ||
| 9 | :- use_module(library(codesio)). | |
| 10 | :- use_module(xtl_program). | |
| 11 | ||
| 12 | plugin_info([ | |
| 13 | % The name of the Plugin | |
| 14 | name = 'ProB Plugin Demonstration' | |
| 15 | % Author is not used yet | |
| 16 | %,author = 'Mark Mustermann' | |
| 17 | % marks the plugin as unstable or stable | |
| 18 | ,status = unstable | |
| 19 | % A list of supported file extensions together with a file description | |
| 20 | ,file_extensions = [ ('Plugin demonstration spec', ['.xtl2', '.PPP']) ] | |
| 21 | % The predicate that is used to load a file. The first argument is the | |
| 22 | % filename, the second the file extension (like '.mch'). | |
| 23 | ,load_file = load_spec/1 | |
| 24 | % The transition skeleton initialises a transition variable in such | |
| 25 | % way that only a part of all transitions match it. It is used to | |
| 26 | % separate time outs and maximum number of computations for several | |
| 27 | % transition classes (like different operations). | |
| 28 | %,transition_skeleton = trans_skel/1 | |
| 29 | % The predicate that computes a transition in the state-space, its | |
| 30 | % arguments are SourceState,Operation,DestinationState,ListOfOperationInfos. | |
| 31 | ,transition = do_transition/4 | |
| 32 | % The predicate that computes an initial state, its arguments are | |
| 33 | % Operation,DestinationState,ListOfOperationInfos. | |
| 34 | ,initialisation = do_initialisation/3 | |
| 35 | % A predicate that returns a property for a given state, its arguments | |
| 36 | % are State,Property. | |
| 37 | ,state_property = find_state_property/2 | |
| 38 | % A predicate that receives a list of expressions,predicates and | |
| 39 | % predicates on transitions as input (list of codes) and returns | |
| 40 | % the parsed expressions. | |
| 41 | % Its arguments are ListOfExpressionStrings,ListOfPredicateStrings, | |
| 42 | % ListOfTransitionPredicateStrings,ListOfExpressions,ListOfPredicates, | |
| 43 | % ListOfTransitionPredicates. | |
| 44 | ,parser = parse_spec/6 | |
| 45 | % A predicate that computes a value of an expression (returned by | |
| 46 | % the parser above) in a state. Its arguments are Expression,State | |
| 47 | %,compute_expression = compute/2 | |
| 48 | % A predicate that evaluates a predicate (returned by the parser above) | |
| 49 | % in a state. Its arguments are Predicate,State | |
| 50 | ,evaluate_predicate = eval/2 | |
| 51 | % A predicate that evaluates a predicate (returned by the parser above) | |
| 52 | % for a transition. Its arguments are Predicate,Transition | |
| 53 | ,evaluate_transition = evaltrans/2 | |
| 54 | % A predicate that checks if a state is initialised. Its argument is a State | |
| 55 | ,is_initialised_state = is_init/1 | |
| 56 | % Pretty-print a transition, the first argument is the transition, the | |
| 57 | % second -the result- is a list of codes. | |
| 58 | %,prettyprint_transition = pp_trans/2 | |
| 59 | % Pretty-print a property, the first argument is the property, the | |
| 60 | % second -the result- is a list of codes. | |
| 61 | %,prettyprint_property = pp_prop/2 | |
| 62 | % Syntax colouring is defined by specifying a list of rules, each | |
| 63 | % containing of a regular expression and a colour class | |
| 64 | ,syntax_colouring = [pair('/\\*', '\\*/',syntax_comment), | |
| 65 | expression('(?=\\m)(start|trans|prop)(?=\\M)', syntax_keyword), | |
| 66 | expression('(?=\\m)(true|fail|atomic|nonvar|var|functor|op|is|ground|member|append|length)(?=\\M)|=', syntax_type), | |
| 67 | expression(':-|!|-->|;|\\.', syntax_assignment), | |
| 68 | expression('%(.*)', syntax_comment)] | |
| 69 | ]). | |
| 70 | ||
| 71 | :- use_module(probsrc(module_information)). | |
| 72 | :- module_info(group,plugin_xtl). | |
| 73 | :- module_info(description,'This module provides the experimental XTL (LTS definition with a Prolog-like syntax) support.'). | |
| 74 | :- module_info(revision,'$Rev$'). | |
| 75 | :- module_info(lastchanged,'$LastChangedDate$'). | |
| 76 | ||
| 77 | :- public load_spec/1, do_transition/4, do_initialisation/3, find_state_property/2, parse_spec/6, eval/2, evaltrans/2, is_init/1. | |
| 78 | ||
| 79 | load_spec(File) :- | |
| 80 | reset, | |
| 81 | '$load'(File). | |
| 82 | ||
| 83 | reset :- | |
| 84 | predicate_property(xtl_program:H,dynamic), | |
| 85 | H \== '$load', | |
| 86 | retractall(xtl_program:H), | |
| 87 | fail. | |
| 88 | reset. | |
| 89 | ||
| 90 | do_initialisation(start_xtl_system,State,[]) :- | |
| 91 | xtl_program:start(State). | |
| 92 | do_transition(State,Operation,NewState,[]) :- | |
| 93 | xtl_program:trans(Operation,State,NewState). | |
| 94 | ||
| 95 | find_state_property(State,Property) :- | |
| 96 | xtl_program:prop(State,Property). | |
| 97 | ||
| 98 | parse_spec(ExprStrings,PredStrings,TransStrings,Exprs,Preds,Trans) :- | |
| 99 | parse_list(ExprStrings,Exprs), | |
| 100 | parse_list(PredStrings,Preds), | |
| 101 | parse_list(TransStrings,Trans). | |
| 102 | parse_list([],[]). | |
| 103 | parse_list([I|Irest],[Term|Trest]) :- | |
| 104 | append(I,".",Codes), | |
| 105 | read_from_codes(Codes,Term), | |
| 106 | parse_list(Irest,Trest). | |
| 107 | ||
| 108 | eval(Pred,State) :- | |
| 109 | find_state_property(State,Pred). | |
| 110 | ||
| 111 | evaltrans(Pred,Trans) :- | |
| 112 | copy_term(Pred,P),P=Trans. | |
| 113 | ||
| 114 | is_init(State) :- State \== root. |