Hello everyone, new around here, glad to be here.

Suppose I have a record,

Record foo :=

{tp:Type; coloftpprop:(tp -> Prop) -> Prop}.

and two foos , foo1 and foo2 and a proof of (tp foo1 = tp foo2). How can I make this definition type check?

Definition fooimpfoo (foo1 foo2:foo) :=

forall fp, (coloftp foo1) fp -> (coloftp foo2) fp.

The error i'm given is:

Error:

In environment

foo1 : foo

foo2 : foo

fp : tp foo1 -> Prop

The term "fp" has type "tp foo1 -> Prop" while it is expected to have type

"tp foo2 -> Prop" (cannot unify "tp foo2" and "tp foo1").

you need to use explicitly the equality. For instance, something like:

```
Definition fooimpfoo (foo1 foo2:foo).
Proof.
refine (forall fp, (coloftp foo1) fp -> (coloftp foo2) _).
rewrite <-your_equality.
exact fp.
Defined.
```

I didn't try it out in Coq, but I hope it gives the idea — feel free to ask question.

One can also write the proof term by hand, but I feel that's more advanced (I'd have to look it up).

Thank you very much, I made it work by :

Definition fooimpfoo (foo1 foo2:foo) (p:tp foo1 = tp foo2):Prop.

Proof.

refine (forall fp, (coloftp foo1) fp -> (coloftp foo2) _).

rewrite <-p.

exact fp.

Defined.

Last updated: Sep 25 2023 at 12:01 UTC