使用 THENL 从 HOL 解释器翻译成 TAC_PROOF

Translating from HOL interpreter to TAC_PROOF with THENL

如果我按顺序将 THENL 括号中的步骤输入 HOL 解释器,它们将正常工作。但是当我使用 THENL 将它们与 TAC_PROOF 组合时,我得到一个错误。

我想我理解 THENTHENL 之间的区别(所有子目标与单个子目标)。但是我找不到区分 2 个初始子目标的语法。 DISJ1_TACRES_TAC 应该只适用于子目标 1。而 DISJ2_TACRES_TAC 应该只适用于子目标 2。

我该如何解决这个问题?

val constructiveDilemmaRule =
TAC_PROOF (([],``! p q r s .(p==>q) /\ (r==>s) ==> p \/ r ==>q \/s``),
REPEAT STRIP_TAC
THENL [DISJ1_TAC THEN RES_TAC]
THENL [DISJ2_TAC, RES_TAC]);

你快搞定了。应用 REPEAT STRIP_TAC 给出了两个子目标,因此 THENL 的列表参数应该包含两个策略:

val g = (([], ``! p q r s .(p ==> q) /\ (r ==> s) ==> p \/ r ==> q \/ s``) : goal);
val tac = (REPEAT STRIP_TAC)
          THENL [DISJ1_TAC THEN RES_TAC,
                 DISJ2_TAC THEN RES_TAC];
val constructiveDilemmaRule = TAC_PROOF (g, tac);

参数列表的第一个元素 (DISJ1_TAC...) 应用于第一个子目标。参数列表的第二个元素 (DISJ2_TAC) 应用于第二个子目标。