You signed in with another tab or window. Reload to refresh your session.You signed out in another tab or window. Reload to refresh your session.You switched accounts on another tab or window. Reload to refresh your session.Dismiss alert
Complete solver for strict orders (transitive+irreflexive relations) for Rocq.
4
+
5
+
## Usage
6
+
7
+
The solver works for any relation that implements the [`Transitive`](https://rocq-prover.org/doc/V9.1.0/corelib/Corelib.Classes.RelationClasses.html#Transitive) and [`Irreflexive`](https://rocq-prover.org/doc/V9.1.0/corelib/Corelib.Classes.RelationClasses.html#Irreflexive) classes. These are implicitly implemented if you instead implement the [`StrictOrder`](https://rocq-prover.org/doc/V9.1.0/corelib/Corelib.Classes.RelationClasses.html#StrictOrder) class.
8
+
9
+
To invoke the solver, use `strict_order rel`, where `rel` is your strict order relation.
10
+
11
+
The solver will close the goal in two cases:
12
+
13
+
1. If your goal is of the form `rel a b` and it is provable from your `rel c d` premises
14
+
2. If your `rel c d` premises lead to a contradiction
15
+
16
+
See [Tests.v](./Tests.v) for example usages and supported use-cases.
17
+
18
+
```rocq
19
+
From Ltac2 Require Import Ltac2.
20
+
From StrictOrderSolver Require Import Solver.
21
+
From Stdlib Require Import Classes.RelationClasses.
22
+
23
+
Axiom rel : nat -> nat -> Prop.
24
+
Instance SO : StrictOrder rel. Admitted.
25
+
26
+
Goal forall a b c d e,
27
+
rel a e -> rel a b -> rel c d -> rel b c -> rel a d.
0 commit comments