I am having trouble with my code and I was wondering if anyone wanted to help me troubleshoot it.

I am getting a lot of errors of a similar type, like this one.

```
Error: Abstracting over the term "x0val - 0" leads to a term
λ n0 : nat, n0,, nat_split x0bd (natgthsn0 x0val) = x0val,, x0bd
which is ill-typed.
Reason is: Illegal application:
The term "@tpair" of type
"∏ (T : UU) (P : T → UU) (pr1 : T), P pr1 → ∑ y, P y"
cannot be applied to the terms
"nat" : "UU"
"λ m : nat, natgtb x m = true" : "nat → UU"
"n0" : "nat"
"nat_split x0bd (natgthsn0 x0val)" : "hProptoType (x0val - 0 < x)"
The 4th term has type "hProptoType (x0val - 0 < x)"
which should be coercible to "(λ m : nat, natgtb x m = true) n0". ```
```

I only want to replace x0val - 0 with x0val by using a lemma that says for all n, n-0=n.

What does this error mean roughly?

A seemingly related problem is that I am having difficulty "capturing" expressions I want to, as if these terms are somehow bound by other expressions but I cannot figure out how.

For example my current goal is

```
j (natlthorgeh (pr1 x) l) = x
```

But when I run

```
set (a:= natlthorgeh (pr1 x) l).
```

nothing happens. The variable a appears in the list of assumptions

but the goal doesn't change its appearance to match this.

However, if I run

```
set (a:= natlthorgeh (pr1 _) l).
```

instead, then I successfully "capture" it.

I have only run across one mention of this error online so far.

http://adam.chlipala.net/cpdt/html/Cpdt.Equality.html

in this page he suggests that it means my functions are "insufficiently polymorphic" but I don't know how to rewrite my code to account for this.

Patrick Nicodemus said:

I only want to replace x0val - 0 with x0val by using a lemma that says for all n, n-0=n.

basically you have a subterm looking like `F (x0val - 0) X`

(with `X : something (x0val - 0)`

), and the replaced version `F x0val X`

is ill-typed

Patrick Nicodemus said:

For example my current goal is

`j (natlthorgeh (pr1 x) l) = x`

what about with `Set Printing All`

?

with Set Printing All it becomes

```
@paths (stn (add l r)) (j (natlthorgeh (@pr1 _ _ x) l)) x
```

it may be possible to do your replacement by first generalizing the X (ie `generalize (nat_split x0bd (natgthsn0 x0val))`

, then the goal looks like `forall X : something (x0val -0), F (x0val - 0) X`

and you can run `replace`

(before doing intro)

ok let me try that

Patrick Nicodemus said:

with Set Printing All it becomes

`@paths (stn (add l r)) (j (natlthorgeh (@pr1 _ _ x) l)) x`

could be a stupid primitive projection problem

for instance

```
Set Primitive Projections.
Record prod (A B:Type) := pair { fst: A; snd : B}.
Arguments fst {_ _}.
Lemma foo (x : prod nat nat) : fst x = 0.
Proof.
set (bla := fst x). (* goal bla = 0 *)
Undo.
unfold fst.
set (bla := fst x). (* goal fst x = 0 *)
```

Ok. Do you think you could elaborate on this? I can understand your example but I don't know why it would behave this way intuitively

there's no intuition about it.

primitive projections can be "folded" or "unfolded". some operations treat the 2 equally, others don't (in this case `set`

's matching doesn't) (for another example, there is no way to tell if a term is "folded" or "unfolded" by setting Print options x_x)

it might be possible to make `set`

treat them equally but that won't help you until you have whatever version of coq has that in your hands

PS I could tell it's a primitive projection because of the `_`

: printed terms only have underscores in `match`

patterns and in primitive projections AFAIK and this isn't a `match`

Ok. Would that affect "rewrite" too? That's the bug i'm looking at right now

The problem fixed itself and I don't know why.

not sure

```
Set Primitive Projections.
Record prod (A B:Type) := pair { fst: A; snd : B}.
Arguments fst {_ _}.
Axiom ax : forall x : prod nat nat, fst x = 0.
Lemma foo (x : prod nat nat) : fst x = 0.
Proof.
unfold fst.
rewrite ax.
```

works but that doesn't imply much for larger examples

Last updated: Sep 26 2023 at 11:01 UTC