2017-06-30 5 views
2

Je veux faire une tactique Ltac en coq qui prendrait 1 ou 3 arguments. Je l'ai lu sur ltac_No_arg dans le module LibTactics mais si je l'ai compris, j'invoquer bien avoir ma tactique avec:Ltac: arguments optionnels tactique

Coq < mytactic arg_1 ltac_no_arg ltac_no_arg. 

qui est pas très pratique.

Est-il possible d'obtenir un résultat comme celui-ci? :

Coq < mytactic arg_1. 

Coq < mytactic arg_1 arg_2 arg_3. 

Répondre

4

Nous pouvons utiliser le mécanisme Tactic Notation pour tenter de résoudre votre problème, car il peut traiter les arguments variadique.

Nous allons réutiliser ltac_No_arg et définir une tactique factice mytactic aux fins de démonstration

Inductive ltac_No_arg : Set := 
    | ltac_no_arg : ltac_No_arg. 

Ltac mytactic x y z := 
    match type of y with 
    | ltac_No_arg => idtac "x =" x (* a bunch of cases omitted *) 
    | _ => idtac "x =" x "; y =" y "; z =" z 
    end. 

Maintenant, nous allons définir les notations tactique ci-dessus:

Tactic Notation "mytactic_notation" constr(x) := 
    mytactic x ltac_no_arg ltac_no_arg. 
Tactic Notation "mytactic_notation" constr(x) constr(y) constr(z) := 
    mytactic x y z. 

Tests:

Goal True. 
    mytactic_notation 1. 
    mytactic_notation 1 2 3. 
Abort. 
+0

QU'EST-CE 'constr (x)'? 'x' en vernaculaire? – jaam

+0

Il spécifie le type d'un argument pour 'Notation tactique'. Ici, 'constr (x)' signifie que nous analysons et interprétons 'x' comme un terme, pas un identifiant, un entier et ainsi de suite. –

+0

Voulez-vous dire [this] (https://coq.inria.fr/refman/Reference-Manual003.html#term)? La définition est aussi large que possible (par exemple, les types et les sortes sont des sous-classes de termes, qualid est un terme, défini comme un identificateur, etc.) – jaam