- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
这是一个数学练习(取自 page 2 - 俄语):
There are 100 visually indistinguishable coins of three types: gold, silver and copper (each type occurs at least once). It is known that gold weighs 3 grams each, silver weighs 2 grams each, copper weighs 1 gram each. How can I determine the type of all coins in no more than 101 weighings on two-plate scales without weights?
(注:我猜这个练习是错误的,最多需要称102次。不过没关系)
解决方法如下:
这是一个硬币列表的例子:
c0 ci cj ck3 3 2 2 2 3 3 1 1 2 1 3|_| |___| |_| i j k
Here is a solution in Isabelle HOL:
datatype coin = GC | SC | CC
datatype comp = LT | EQ | GT
primrec coin_weight :: "coin ⇒ nat" where
"coin_weight CC = 1"
| "coin_weight SC = 2"
| "coin_weight GC = 3"
primrec sum_list where
"sum_list f [] = 0"
| "sum_list f (x # xs) = f x + sum_list f xs"
definition weigh :: "coin list ⇒ coin list ⇒ comp" where
"weigh xs ys = (
let xw = sum_list coin_weight xs in
let yw = sum_list coin_weight ys in
if xw < yw then LT else
if xw > yw then GT else EQ)"
definition std_weigh :: "coin list ⇒ coin ⇒ nat" where
"std_weigh xs ys ≡ (case weigh xs [ys] of LT ⇒ 3 | GT ⇒ 1 | EQ ⇒ 2)"
definition gen_weights :: "coin list ⇒ coin ⇒ coin list ⇒ nat ⇒ nat ⇒ nat ⇒ nat ⇒ nat ⇒ nat ⇒ nat list" where
"gen_weights cs c⇩0 std i j k w⇩j w⇩k w ≡
― ‹Optional heavy coins (\<^term>‹c⇩0›...)›
replicate i (std_weigh std c⇩0) @
― ‹Light coins (\<^term>‹c⇩i›...)›
replicate j w⇩j @
― ‹Heavy coins (\<^term>‹c⇩j›...)›
replicate k w⇩k @
― ‹A light coin (\<^term>‹c⇩k›)›
[w] @
― ‹Rest coins›
map (std_weigh std) cs"
primrec determine_weights where
"determine_weights [] c⇩0 c⇩i c⇩j i j k = None"
| "determine_weights (c⇩k # cs) c⇩0 c⇩i c⇩j i j k = (
case weigh [c⇩j] [c⇩k]
of LT ⇒ Some (gen_weights cs c⇩0 [c⇩j] i j (Suc k) 1 2 3)
| GT ⇒ Some (
case weigh [c⇩i] [c⇩k]
of LT ⇒ gen_weights cs c⇩0 [c⇩k] i j (Suc k) 1 3 2
| GT ⇒ gen_weights cs c⇩0 [c⇩i] i j (Suc k) 2 3 1
| EQ ⇒ (
case weigh [c⇩i, c⇩k] [c⇩j]
of LT ⇒ gen_weights cs c⇩0 [c⇩i, c⇩k] i j (Suc k) 1 3 1
| GT ⇒ gen_weights cs c⇩0 [c⇩k] i j (Suc k) 2 3 2
| EQ ⇒ gen_weights cs c⇩0 [c⇩j] i j (Suc k) 1 2 1))
| EQ ⇒ determine_weights cs c⇩0 c⇩i c⇩j i j (Suc k))"
primrec find_heavier where
"find_heavier [] c⇩0 c⇩i i j alt = None"
| "find_heavier (c⇩j # cs) c⇩0 c⇩i i j alt = (
case weigh [c⇩i] [c⇩j]
of LT ⇒ determine_weights cs c⇩0 c⇩i c⇩j i (Suc j) 0
| GT ⇒ alt cs c⇩j (Suc j)
| EQ ⇒ find_heavier cs c⇩0 c⇩i i (Suc j) alt)"
primrec weigh_coins where
"weigh_coins [] = Some []"
| "weigh_coins (c⇩0 # cs) =
find_heavier cs c⇩0 c⇩0 0 0
(λcs c⇩i i. find_heavier cs c⇩0 c⇩i i 0
(λcs c⇩j j. Some (gen_weights cs c⇩0 [c⇩i] 0 i j 3 2 1)))"
我可以证明解决方案对具体案例有效:
definition "coins ≡ [GC, GC, SC, SC, SC, GC, GC, CC, CC, SC, CC, GC]"
value "weigh_coins coins"
lemma weigh_coins_ok:
"cs = coins ⟹
weigh_coins cs = Some ws ⟹
ws = map coin_weight cs"
by (induct cs; auto simp: coins_def weigh_def gen_weights_def std_weigh_def)
lemma weigh_coins_length_ok:
"cs = coins ⟹
weigh_coins cs = Some ws ⟹
length cs = length ws"
by (induct cs; auto simp: coins_def weigh_def gen_weights_def std_weigh_def)
但是我不知道如何在一般情况下证明它:
lemma weigh_coins_ok:
"weigh_coins cs = Some ws ⟹
ws = map coin_weight cs"
proof (induct cs)
case Nil
then show ?case by simp
next
case (Cons c cs)
then show ?case
qed
我不能对 cs
进行归纳,因为我需要证明这一点
weigh_coins (c # cs) = Some ws ⟹ ∃ws. weigh_coins cs = Some ws
它不成立。我可以为 [CC, SC, GC]
确定权重,但不能为 [SC, GC]
确定权重。
另一种方法是针对特殊情况证明这些引理:
[CC, CC, ...] @ [SC, SC, ...] @ [GC, GC, ...] @ ...
[CC, CC, ...] @ [GC, GC, ...] @ [SC, SC, ...] @ ...
[SC, SC, ...] @ [GC, GC, ...] @ [CC, CC, ...] @ ...
...
然后证明案例列表是详尽无遗的。
例如:
lemma weigh_coins_length:
"cs = [CC] @ replicate n CC @ [SC, GC] ⟹
weigh_coins cs = Some ws ⟹
length cs = length ws"
apply (induct n arbitrary: cs ws)
apply (auto simp: weigh_def gen_weights_def std_weigh_def)[1]
但是我连这个引理都无法证明。
问题是:
weigh
函数在算法中最多使用n + 2
次的引理,其中n
是硬币?最佳答案
一些一般提示:
您有三个递归函数:determine_weights
、find_heavier
、weigh_coins
。
对于每个递归函数,尝试在不使用递归(而是使用量词)的情况下表达输入和结果之间的关系。您为前面的函数证明的属性必须足够强大以证明后面的函数的属性。此外,该属性不应修复任何参数。例如,find_heavier
最初总是使用 j = 0
调用,但该属性应该适用于 j
的所有值,以便它可以在期间使用归纳法。
同时尝试在您的描述中制定和证明高级步骤:例如表明此函数找到一枚银币或两枚铜币。
关于问题2:
我会尝试以不可能作弊的方式陈述问题。例如:
datatype strategy =
Return "coin list"
| Weigh "nat list" "nat list" "comp ⇒ strategy" ― ‹Weigh coins based on positions›
definition "select indexes coins ≡ map (nth coins) indexes"
fun runStrategy where
"runStrategy coins _ (Return r) = Some r"
| "runStrategy coins 0 _ = None"
| "runStrategy coins (Suc n) (Weigh xs ys cont) = (
if distinct xs ∧ distinct ys ∧ set xs ∩ set ys = {} then
runStrategy coins n (cont (weigh (select xs coins) (select ys coins)))
else None)"
lemma "∃strategy. ∀coins.
length coins = 100 ∧ (∀c. c ∈ set coins)
⟶ runStrategy coins 101 strategy = Some coins"
这里 runStrategy 最多调用 weigh
101 次,除了传递给 Weigh
的比较结果外,该策略无法学习任何关于硬币的信息。
关于isabelle - 非平凡列表函数的归纳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/60134167/
我需要在一篇论文中做一个演示,该论文在某些时候使用了 Isabelle/Isar 和 Isabelle/HOL。 我尝试在线研究 Isabelle/HOL 和 Isabelle/Isar,以便能够在一
我想在一个名为 List 的理论中定义我自己的列表类型,但已经有一个同名的理论。 有没有比Main更轻量级的理论? ? 最佳答案 请注意 $ISABELLE_HOME/src/HOL/ex/Seq.t
Isabelle 中的“商型模式”是什么? 我在互联网上找不到任何解释。 最佳答案 如果你能从你看到这句话的地方引用一点会更好。我知道“模式匹配”,我知道“商类型”,但我不知道“商类型模式”。 我宁愿
有时我发现很难使用 Isabelle,因为我无法像在正常编程中那样使用“打印命令”。 比如我想看什么?thesis .具体语义书说: The unknown ?thesis is implicitly
我是 isabelle 的新手,并试图证明以下简单的不等式: lemma ineq: "(a::real) > 0 ⟹ a 0 ⟹ b 0" proof have "1/a + 1/b >
输入以下定义时 datatype env = "nat => 'a option" Isabelle/jedit 显示一个感叹号并说 Legacy feature! Bad name binding:
在 Isabelle 中,有时会遇到存在重复子目标的场景。例如,想象以下证明脚本: lemma "a ∧ a" apply (rule conjI) 目标: proof (prove): step
Isabelle/jEdit 中的颜色代码是什么意思?我在 Isabelle/jEdit manual 中找不到他们的描述.它唯一写的是 Prover feedback works via color
如何在 Isabelle 中定义常量集?例如像 {1,2,3}(给它一个更有趣的转折,1,2,3 是实数),或 {x\in N: x < m},其中 m 是某个固定数字 - 或者,也许更难,集合 {N
假设我在 Isabelle 中写了一个引理“(∀a. P a ⟹ Q a) ⟹ R b”。 ∀a只会量化 P a .如果我想量化超过 P a ⟹ Q a但是,在 ∀a 后面加上括号(即“(∀a. (P
使用 Isar 时,我发现了一个令人惊讶的行为(对我而言)。 我尝试使用假设,有时 Isar 提示它无法解决未决目标,例如我最典型的例子是有一个假设但无法假设它: lemma assumes "A
在伊莎贝尔中,人们通常可以达到证明目标,其中中间类型的术语对于证明的正确性至关重要。例如,考虑以下引理,将 nat 42 转换为 'a word,然后再返回: theory Test imports
已关注 how-to-use-persistent-heap-images-to-make-loading-of-theories-faster-in-isabelle另一个建议是我为 Nominal
我尝试使用 partial_function 关键字定义部分函数。它不起作用。这是最能表达直觉的: partial_function (tailrec) oddity :: "nat => nat"
我知道如何在 Isabelle 中制作“术语缩写”,但我可以制作行为相同的“类型缩写”吗? 我可以定义一个“术语缩写”使用 abbreviation "foo == True" 从此以后,输出中出现的
如何在 Isabelle 中将集合转换为列表? 我对带有签名的函数定义感兴趣: "'a set => 'a list" 我该如何定义? 最佳答案 通过搜索 "'a set" "'a list"在我偶然
我想用简化词来替换不等式的子项。我将通过一个示例来说明这一点,而不是对我的问题进行通用定义: 假设我有一个简单的编程语言和一个基于它的 Hoare 逻辑。假设我们有 if、while 和序列操作。此外
我是一名刚开始习惯 Isabelle 的数学家,而本应非常简单的事情却令人沮丧。如何定义两个常量之间的函数?比如说,函数 f: {1,2,3}\to {1,2,4} 映射 1 到 1、2 到 4 和
我想找到定理。我已阅读 find_theorems 上的部分在 Isabelle/Isar reference manual : find_theorems criteria Retrieves fa
我试图在 Isabelle/HOL 中证明这个引理。 引理“(0::nat) ≠ undefined” 但是挑剔的人找到了这个和它的否定的反例 引理“(0::nat) = undefined” 这怎么
我是一名优秀的程序员,十分优秀!