在列表理解中使用对给出了冗余子句"警告

时间:2014-05-27 16:18:03

标签: list-comprehension isabelle

当我在列表理解中使用(_,_)模式时,我收到一个奇怪的警告。我的最小工作示例如下。

theory Misc imports 
  Main
  "~~/src/HOL/Library/Code_Target_Numeral"
begin

definition "xys = [(1::int,2::int),(2,3),(3,4)]"

value "[x+4. (x,_) ← xys]"

end

一切似乎都运转良好,但我收到了警告

  

以下条款是多余的(由前面的条款涵盖):

     

x⇒[]

我应该担心吗?

1 个答案:

答案 0 :(得分:3)

无需担心。

语法

[a+4. (a, b) ← xys]

在内部翻译为

concat (map (λx. case x of (a, b) ⇒ [a + 4] | _ ⇒ []) xys)

(请参阅"列表理解" HOL/List.thy)。

这里发生的事情是,如果您的模式(a, b)匹配,它将映射到您的表达式a + 4case表达式的前半部分)。如果它不匹配,它将从输出列表中删除(case表达式的后半部分)。在您的情况下,模式(a, b)将始终匹配,这意味着后半部分是多余的 - 因此警告。

在理想情况下,如果用户输入的模式始终匹配,则列表推导实现将被修改为不生成case表达式的后半部分。在此之前,忽略警告是安全的。