Coq 停留在;“收缩缓冲器”;类型类解析发散后

Coq 停留在;“收缩缓冲器”;类型类解析发散后,coq,Coq,当使用TypeClass时,Coq有时会出现分歧。当这种情况在Proof General下发生时,Emacs也挂起 我知道的最好的恢复方法是中断emacs(C-g)并重新启动Coq(C-C-x)。但是,这并不是简单地终止Coq进程,而是让我处于一种模式,Emacs再次被挂起,在相当长的一段时间内显示“收回缓冲区…”(有时是如此之长,以至于我放弃了,只是开始了一个全新的Emacs!) 为什么? 有更好的办法吗?(还有:当这种情况发生时,是否有一个简单的第一步来观察什么是首先发散的?我不知道这是否真

当使用TypeClass时,Coq有时会出现分歧。当这种情况在Proof General下发生时,Emacs也挂起

我知道的最好的恢复方法是中断emacs(C-g)并重新启动Coq(C-C-x)。但是,这并不是简单地终止Coq进程,而是让我处于一种模式,Emacs再次被挂起,在相当长的一段时间内显示“收回缓冲区…”(有时是如此之长,以至于我放弃了,只是开始了一个全新的Emacs!)

为什么?


有更好的办法吗?(还有:当这种情况发生时,是否有一个简单的第一步来观察什么是首先发散的?

我不知道这是否真的起作用,但有时我发现如果我按几次
C-C-C
,证明一般会中断Coq


至于第二个问题,您可以在调用有问题的行之前将
Set-Typeclasses-Debug.
添加到脚本中。然后Coq将在Emacs中的
*response*
缓冲区中打印其实例搜索的跟踪。如果您的脚本正在循环,请确保在触发循环后立即点击
C-C-C
,因为在最后一位,跟踪可能会非常长且非常快,我提醒自己

设置类型类调试


奇怪的是:我不确定emacs到底是被卡住了,还是它是一个显示错误:似乎如果我切换到另一个屏幕,然后再切换回来,我会立即找到我期望的coq exited消息

如果emacs挂起的不是垃圾收集,通常可以使用
C-g
中断它。如果
C-C-x
/
C-C-C
不起作用,您可以使用
pkill coqtop
从process manager/命令行终止coqtop进程

这是因为coqtop有一些循环,它没有检查中断,或者没有足够频繁地检查,因此它没有及时捕获来自PG的中断


此外,如其他答案中所述,
Set Typeclasses Debug
将在
*response*
*coq*
缓冲区中为您提供一个非常详细的类型类解析日志。

谢谢——这很有用。进一步的经验表明,C-C-x最终会起作用,但有时需要相当长的时间。我认为,
C-C-x
会等到Coq处理完一条语句后再重新启动Coq,而
C-C-C
会向Coq发送一个中断。我通常会交替使用垃圾邮件
C-C-C
C-g
,有时会放弃这一点和
pkill coqtop