Difference between pages "New Tactic Providers" and "Help:Assigning permissions"

From Event-B
(Difference between pages)
Jump to navigationJump to search
imported>Laurent
(→‎API Proposal: changed use of UserSupport.)
 
(yiInRYSih)
 
Line 1: Line 1:
The purpose is to give more flexibility to tactic providers by allowing them to provide as many tactic applications as they will for a given proof node, even they apply to the same predicate and at the same position.  
+
comment2, http://xpahcgoo.p2web.biz/horse6286.html horsesuprgp, http://xpahcgoo.110mb.com/horse982.html horse, =-), http://xpahcgoo.sitebooth.com/for2183.html for, bqjd, http://xpahcgoo.p2web.biz/free6118.html free, 520248, http://xpahcgoo.seitenclique.net/horse8953.html horse, >:-[[, http://xpahcgoo.p2web.biz/free2529.html free, vpjx, http://xpahcgoo.freehostingz.com/free5189.html free, fmzuc, http://xpahcgoo.freewhost.com/free54.html free, 91047, http://xpahcgoo.hostmo.com/free1678.html free, 11004, http://xpahcgoo.seitenclique.net/free4294.html free, %-D,
 
 
== API Proposal ==
 
 
 
The current proposal consists in the following published interfaces:
 
 
 
public interface ITacticProvider2 {
 
    List<ITacticApplication> getPossibleApplications(IProofTreeNode node,
 
                                                    Predicate hyp,
 
                                                    String globalInput);
 
  }
 
 
 
public interface ITacticApplication {
 
    ITactic getTactic(String[] inputs,
 
              String globalInput,
 
              IProgressMonitor monitor);
 
}
 
 
 
public interface IPositionApplication  extends ITacticApplication {
 
    Point getHyperlinkBounds();
 
    String getHyperlinkLabel();
 
}
 
 
 
public interface IPredicateApplication extends ITacticApplication {
 
    Image getIcon();
 
    String getTooltip();
 
}
 
 
 
The current extension point "proofTactics" remains unchanged.
 
 
 
All those interfaces are intended to be implemented by clients.
 
 
 
== Explanations ==
 
 
 
The idea is to encapsulate in {{class|ITacticApplication}} all data needed by the UI to display and apply tactics.
 
Thus, an {{class|ITacticProvider2}}, instead of returning just one fixed tactic to apply, can return several possible 'autonomous' tactic applications.
 
 
 
 
 
Interfaces {{class|IPositionApplication}} and {{class|IPredicateApplication}} are particular application types:
 
 
 
* {{class|IPositionApplication}} is for tactics applied at a given position in a formula (red hyperlinks in interactive prover UI). The methods allow to override extension point data, in order to have a different text for each application in the hyperlink list. If '''null''' is returned, then default data from extension point is taken.
 
 
 
* {{class|IPredicateApplication}} is for tactics applied at a whole predicate, like 'Contradict Goal' or 'Contradict Hyp' (icons on the left of a predicate in interactive prover UI). The methods allow to override extension point data, in order to have a different icon and tooltip for each application in the left icon list. If '''null''' is returned, then default data from extension point is taken.
 
 
 
== Example ==
 
 
 
The following example demonstrates (part of) the implementation of a tactic using the proposed API.
 
For simplicity, a simple {{class|ITacticApplication}} is used, but a {{class|IPositionApplication}} could (should) be used instead.
 
The underlying {{class|IReasoner}} ({{class|ExampleReasoner}}) is not shown here, as it is not impacted by the proposed API.
 
 
 
<pre>
 
// rewrites occurrences of literal 4 into either 2+2 or 2*2
 
public class ExampleTacticProvider2 implements ITacticProvider2 {
 
 
 
    // our own implementation of a tactic application
 
    private static class ExampleApplication implements ITacticApplication {
 
 
 
        private final IUserSupport userSupport;
 
        private final Predicate hyp;
 
        private final IPosition position;
 
        // 2 Kinds: PLUS (2+2) and MULT (2*2)
 
        private final ExampleReasoner.Kind kind;
 
 
 
        public ExampleApplication(IUserSupport userSupport, Predicate hyp, IPosition position, Kind kind) {
 
            this.userSupport = userSupport;
 
            this.hyp = hyp;
 
            this.position = position;
 
            this.kind = kind;
 
        }
 
 
 
        public void apply(String[] inputs, String globalInput, IProgressMonitor monitor) {
 
            try {
 
                // ExampleReasoner implements IReasoner and rewrites literal 4
 
                // at given position into:
 
                // . 2+2 if input.kind is PLUS
 
                // . 2*2 if input.kind is MULT
 
                userSupport.applyTactic(BasicTactics.reasonerTac(
 
                        new ExampleReasoner(),
 
                        new ExampleReasoner.Input(hyp, position, kind)),
 
                        true, monitor);
 
            } catch (RodinDBException e) {
 
                // log the problem
 
            }
 
        }
 
    }
 
 
 
    // visits a formula and adds applications on occurrences of literal 4
 
    private static class ExampleApplicationVisitor extends DefaultVisitor {
 
 
 
        private final IUserSupport userSupport;
 
        private final Predicate hyp;
 
        private final Predicate predicate;
 
        // a list to put applications into
 
        private final List<ITacticApplication> applications;
 
 
 
        public ExampleApplicationVisitor(IUserSupport userSupport,
 
                Predicate predicate, Predicate hyp,
 
                List<ITacticApplication> applications) {
 
            this.userSupport = userSupport;
 
            this.predicate = predicate;
 
            this.hyp = hyp;
 
            this.applications = applications;
 
        }
 
 
 
        @Override
 
        public boolean visitINTLIT(IntegerLiteral lit) {
 
            if (lit.getValue().intValue() == 4) {
 
                final IPosition position = predicate.getPosition(lit.getSourceLocation());
 
                applications.add(new ExampleApplication(userSupport, hyp, position, Kind.MULT));
 
                applications.add(new ExampleApplication(userSupport, hyp, position, Kind.PLUS));
 
            }
 
            return true;
 
        }
 
    }
 
 
 
    // the ITacticProvider2 interface method: calls the visitor on the predicate
 
    public List<ITacticApplication> getPossibleApplications(IUserSupport userSupport,
 
                                                            IProofTreeNode node,
 
                                                            Predicate hyp,
 
                                                            String globalInput) {
 
 
 
        final Predicate pred = (hyp == null) ? node.getSequent().goal() : hyp;
 
 
 
        final List<ITacticApplication> applications = new ArrayList<ITacticApplication>();
 
       
 
        pred.accept(new ExampleApplicationVisitor(userSupport, pred, hyp, applications));
 
       
 
        return applications;
 
    }
 
}
 
</pre>
 

Revision as of 07:57, 10 August 2008