css
This commit is contained in:
@@ -179,9 +179,9 @@ function PlayableLevel({worldId, levelId}) {
|
|||||||
<Split minSize={0} snapOffset={200} sizes={[50, 25, 25]} className={`app-content level ${level.isLoading ? 'hidden' : ''}`}>
|
<Split minSize={0} snapOffset={200} sizes={[50, 25, 25]} className={`app-content level ${level.isLoading ? 'hidden' : ''}`}>
|
||||||
<div className="exercise-panel">
|
<div className="exercise-panel">
|
||||||
<div ref={introductionPanelRef} className="introduction-panel">
|
<div ref={introductionPanelRef} className="introduction-panel">
|
||||||
<Alert severity="info" sx={{ mt: 1 }}>
|
<div className="message info">
|
||||||
<Markdown>{level?.data?.introduction}</Markdown>
|
<Markdown>{level?.data?.introduction}</Markdown>
|
||||||
</Alert>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="exercise">
|
<div className="exercise">
|
||||||
{/* <h4>Aufgabe:</h4> */}
|
{/* <h4>Aufgabe:</h4> */}
|
||||||
@@ -205,9 +205,9 @@ function PlayableLevel({worldId, levelId}) {
|
|||||||
</EditorContext.Provider>
|
</EditorContext.Provider>
|
||||||
|
|
||||||
{completed && <div className="conclusion">
|
{completed && <div className="conclusion">
|
||||||
<Alert severity="info" sx={{ mt: 1 }}>
|
<div className="message info">
|
||||||
<Markdown>{level?.data?.conclusion}</Markdown>
|
<Markdown>{level?.data?.conclusion}</Markdown>
|
||||||
</Alert>
|
</div>
|
||||||
{levelId >= gameInfo.data?.worldSize[worldId] ?
|
{levelId >= gameInfo.data?.worldSize[worldId] ?
|
||||||
<Button to={`/`}><FontAwesomeIcon icon={faHome} /></Button> :
|
<Button to={`/`}><FontAwesomeIcon icon={faHome} /></Button> :
|
||||||
<Button to={`/world/${worldId}/level/${levelId + 1}`}>
|
<Button to={`/world/${worldId}/level/${levelId + 1}`}>
|
||||||
@@ -237,11 +237,11 @@ function Introduction({worldId}) {
|
|||||||
<LevelAppBar isLoading={gameInfo.isLoading} levelTitle="Einführung" worldId={worldId} levelId={0} />
|
<LevelAppBar isLoading={gameInfo.isLoading} levelTitle="Einführung" worldId={worldId} levelId={0} />
|
||||||
<div style={gameInfo.isLoading ? {display: "none"} : null} className="exercise-panel">
|
<div style={gameInfo.isLoading ? {display: "none"} : null} className="exercise-panel">
|
||||||
<div className="introduction-panel">
|
<div className="introduction-panel">
|
||||||
<Alert severity="info" sx={{ mt: 1 }}>
|
<div className="message info">
|
||||||
<Markdown>
|
<Markdown>
|
||||||
{gameInfo.data?.worlds.nodes[worldId].introduction}
|
{gameInfo.data?.worlds.nodes[worldId].introduction}
|
||||||
</Markdown>
|
</Markdown>
|
||||||
</Alert>
|
</div>
|
||||||
</div>
|
</div>
|
||||||
<div className="conclusion">
|
<div className="conclusion">
|
||||||
{0 == gameInfo.data?.worldSize[worldId] ?
|
{0 == gameInfo.data?.worldSize[worldId] ?
|
||||||
|
|||||||
@@ -4,7 +4,7 @@ import { Alert, FormControlLabel, Switch } from '@mui/material';
|
|||||||
import Markdown from '../Markdown';
|
import Markdown from '../Markdown';
|
||||||
|
|
||||||
function Hint({hint} : {hint: GameHint}) {
|
function Hint({hint} : {hint: GameHint}) {
|
||||||
return <Alert severity="info" sx={{ mt: 1 }}><Markdown>{hint.text}</Markdown></Alert>
|
return <div className="message info"><Markdown>{hint.text}</Markdown></div>
|
||||||
}
|
}
|
||||||
|
|
||||||
export function Hints({hints} : {hints: GameHint[]}) {
|
export function Hints({hints} : {hints: GameHint[]}) {
|
||||||
|
|||||||
@@ -4,9 +4,9 @@
|
|||||||
padding: 5px 10px;
|
padding: 5px 10px;
|
||||||
border-radius: 3px 3px 3px 3px;
|
border-radius: 3px 3px 3px 3px;
|
||||||
}
|
}
|
||||||
.message.information {
|
.message.info {
|
||||||
color: #059;
|
/* color: #059; */
|
||||||
background-color: #BEF;
|
background-color: #DDF6FF;
|
||||||
}
|
}
|
||||||
.message.warning {
|
.message.warning {
|
||||||
color: #9F6000;
|
color: #9F6000;
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import TestGame.Metadata
|
import TestGame.Metadata
|
||||||
|
|
||||||
import Mathlib
|
import Mathlib
|
||||||
import TestGame.Options.BigOperators
|
import TestGame.ToBePorted
|
||||||
|
|
||||||
set_option tactic.hygienic false
|
set_option tactic.hygienic false
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,7 @@
|
|||||||
import TestGame.Metadata
|
import TestGame.Metadata
|
||||||
|
|
||||||
import Mathlib
|
import Mathlib
|
||||||
import TestGame.Options.BigOperators
|
import TestGame.ToBePorted
|
||||||
|
|
||||||
set_option tactic.hygienic false
|
set_option tactic.hygienic false
|
||||||
|
|
||||||
|
|||||||
@@ -74,13 +74,14 @@ Statement
|
|||||||
· Hint "**Robo**: Jetzt musst du alle eigenschaften eines $\\mathbb\{Q}$-Moduls zeigen,
|
· Hint "**Robo**: Jetzt musst du alle eigenschaften eines $\\mathbb\{Q}$-Moduls zeigen,
|
||||||
das sind also 6 einzelne Goals."
|
das sind also 6 einzelne Goals."
|
||||||
intro b
|
intro b
|
||||||
Hint "**Robo**: Mit `change (1 : ℚ) * b = b` kannst du das Goal umschreiben, damit
|
Hint "**Robo**: Mit `change (1 : ℚ) * {b} = {b}` kannst du das Goal umschreiben, damit
|
||||||
dann andere Taktiken besser damit arbeiten können."
|
dann andere Taktiken besser damit arbeiten können."
|
||||||
change (1 : ℚ) * b = b
|
change (1 : ℚ) * b = b
|
||||||
Hint "**Robo**: Den Teil kannst du mit `simp` beweisen."
|
Hint "**Robo**: Den Teil kannst du mit `simp` beweisen."
|
||||||
simp
|
simp
|
||||||
· intro x y b
|
· intro x y b
|
||||||
Hint "**Robo**: Benutze `change` um `•` durch `*` zu ersetzen."
|
Hint "**Robo**: Benutze `change` um `•` durch `*` zu ersetzen."
|
||||||
|
Hint (hidden := true) "**Robo**: Explizit `change ({x} * {y} : ℚ) * {b} = {x} * ({y} * {b})`"
|
||||||
change (x * y : ℚ) * b = x * (y * b)
|
change (x * y : ℚ) * b = x * (y * b)
|
||||||
Hint "**Robo**: Mit `simp` und `ring` kannst du den Rest beweisen."
|
Hint "**Robo**: Mit `simp` und `ring` kannst du den Rest beweisen."
|
||||||
simp
|
simp
|
||||||
@@ -88,13 +89,17 @@ Statement
|
|||||||
· intro a
|
· intro a
|
||||||
simp
|
simp
|
||||||
· intro a x y
|
· intro a x y
|
||||||
|
Hint (hidden := true) "**Robo**: Explizit `change {a} * ({x} + {y}) = {a} * {x} + {a} * {y}`"
|
||||||
change a * (x + y) = a * x + a * y
|
change a * (x + y) = a * x + a * y
|
||||||
ring
|
ring
|
||||||
· intro r s x
|
· intro r s x
|
||||||
|
Hint (hidden := true) "**Robo**: Explizit
|
||||||
|
`change ({r} + {s} : ℚ) * {x} = {r} * {x} + {s} * {x}`"
|
||||||
change (r + s : ℚ) * x = r * x + s * x
|
change (r + s : ℚ) * x = r * x + s * x
|
||||||
simp
|
simp
|
||||||
ring
|
ring
|
||||||
· intro a
|
· intro a
|
||||||
|
Hint (hidden := true) "**Robo**: Explizit `change (0 : ℚ) * {a} = 0`"
|
||||||
change (0 : ℚ) * a = 0
|
change (0 : ℚ) * a = 0
|
||||||
simp
|
simp
|
||||||
|
|
||||||
|
|||||||
@@ -15,30 +15,14 @@ Title "Konkrete Vektorräume"
|
|||||||
|
|
||||||
Introduction
|
Introduction
|
||||||
"
|
"
|
||||||
Häufig in der linearen Algebra hat man ganz einfach Vektoren über `ℚ` oder `ℝ`
|
Den $\\mathbb{Q}$-Vektorraum $\\mathbb{Q}^3$ definiert man am besten mit
|
||||||
und möchte diese explizit definieren.
|
der lokalen Notation
|
||||||
|
|
||||||
Reele Vektorräume definiert man in Lean am besten als Funktion von einem Indexset.
|
|
||||||
|
|
||||||
So ist `Fin 2` eine Menge, die nur `0` und `1` enthält
|
|
||||||
und `ℚ²` wird als `Fin 2 → ℚ` definiert. Hier machen wir uns eine
|
|
||||||
lokale notation dafür:
|
|
||||||
|
|
||||||
```
|
```
|
||||||
notation `ℚ²` := Fin 2 → ℚ
|
local notation `ℚ³` := Fin 3 → ℚ
|
||||||
```
|
```
|
||||||
|
|
||||||
Das mag auf den ersten Blick etwas unintuitiv erscheinen, hat aber den Vorteil,
|
Dabei ist `Fin 3` die Indexmenge $\\{0, 1, 2\\}$.
|
||||||
dass man die ganze
|
|
||||||
Infrastruktur für Funktionen einfach direkt für Vektoren und
|
|
||||||
Matrizen mitgebrauchen kann.
|
|
||||||
|
|
||||||
Wir können uns auch noch ein paar andere standardmässige `ℚ`-Vektorräume definieren.
|
|
||||||
|
|
||||||
```
|
|
||||||
notation \"ℚ³\" => Fin 3 → ℚ
|
|
||||||
notation \"ℚ^(\" n \")\" => (Fin n) → ℚ
|
|
||||||
```
|
|
||||||
|
|
||||||
Die schreibweise für einen Vektor ist `![ _, _ ]`. Zu beachten ist,
|
Die schreibweise für einen Vektor ist `![ _, _ ]`. Zu beachten ist,
|
||||||
dass man bei Zahlen explizit einen Typ angeben muss, sonst denkt sich
|
dass man bei Zahlen explizit einen Typ angeben muss, sonst denkt sich
|
||||||
@@ -61,8 +45,8 @@ Dann eine Vektorgleichung komponentenweise aufteilt.
|
|||||||
Für jede Komponente kann man dann mit `simp` und `ring` weiterkommen.
|
Für jede Komponente kann man dann mit `simp` und `ring` weiterkommen.
|
||||||
"
|
"
|
||||||
|
|
||||||
notation "ℚ³" => Fin 3 → ℚ
|
local notation "ℚ³" => Fin 3 → ℚ
|
||||||
notation "ℚ^(" n ")" => (Fin n) → ℚ
|
local notation "ℚ^(" n ")" => (Fin n) → ℚ
|
||||||
|
|
||||||
Statement
|
Statement
|
||||||
""
|
""
|
||||||
|
|||||||
@@ -16,19 +16,18 @@ Introduction
|
|||||||
"
|
"
|
||||||
Ihr bemerkt, dass mit dem Jungen noch zwei andere
|
Ihr bemerkt, dass mit dem Jungen noch zwei andere
|
||||||
Kinder zuhörten. Eines der beiden Mädchen hat ebenfalls eine Frage.
|
Kinder zuhörten. Eines der beiden Mädchen hat ebenfalls eine Frage.
|
||||||
|
|
||||||
|
|
||||||
Hat man zwei Mengen `(A B : Set ℕ)` kann man fragen, ob diese Teilmengen
|
|
||||||
voneinander sind: `A ⊆ B` (`\\sub`/`\\ss`) ist die Notation für Teilmengen, die auch gleich
|
|
||||||
sein können.
|
|
||||||
|
|
||||||
`A ⊆ B` ist als `∀ x, x ∈ A → x ∈ B` definiert, das heisst, ein `⊆` kann immer auch mit `intro x hx`
|
|
||||||
angegangen werden.
|
|
||||||
|
|
||||||
Die Taktik `tauto` macht das automatisch, aber um dies zu lernen ist `tauto` hier deaktiviert.
|
|
||||||
Benutze also `intro`:
|
|
||||||
"
|
"
|
||||||
|
|
||||||
|
-- Hat man zwei Mengen `(A B : Set ℕ)` kann man fragen, ob diese Teilmengen
|
||||||
|
-- voneinander sind: `A ⊆ B` (`\\sub`/`\\ss`) ist die Notation für Teilmengen, die auch gleich
|
||||||
|
-- sein können.
|
||||||
|
|
||||||
|
-- `A ⊆ B` ist als `∀ x, x ∈ A → x ∈ B` definiert, das heisst, ein `⊆` kann immer auch mit `intro x hx`
|
||||||
|
-- angegangen werden.
|
||||||
|
|
||||||
|
-- Die Taktik `tauto` macht das automatisch, aber um dies zu lernen ist `tauto` hier deaktiviert.
|
||||||
|
-- Benutze also `intro`:
|
||||||
|
|
||||||
namespace MySet
|
namespace MySet
|
||||||
|
|
||||||
open Set
|
open Set
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import TestGame.Metadata
|
import TestGame.Metadata
|
||||||
|
|
||||||
import TestGame.Options.BigOperators
|
import TestGame.ToBePorted
|
||||||
|
|
||||||
set_option tactic.hygienic false
|
set_option tactic.hygienic false
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import TestGame.Metadata
|
import TestGame.Metadata
|
||||||
|
|
||||||
import TestGame.Options.BigOperators
|
import TestGame.ToBePorted
|
||||||
import Mathlib
|
import Mathlib
|
||||||
|
|
||||||
set_option tactic.hygienic false
|
set_option tactic.hygienic false
|
||||||
|
|||||||
@@ -3,7 +3,7 @@ import TestGame.Metadata
|
|||||||
import Mathlib.Algebra.BigOperators.Fin
|
import Mathlib.Algebra.BigOperators.Fin
|
||||||
import Mathlib.Tactic.Ring
|
import Mathlib.Tactic.Ring
|
||||||
|
|
||||||
import TestGame.Options.BigOperators
|
import TestGame.ToBePorted
|
||||||
|
|
||||||
set_option tactic.hygienic false
|
set_option tactic.hygienic false
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import TestGame.Metadata
|
import TestGame.Metadata
|
||||||
|
|
||||||
import TestGame.Options.BigOperators
|
import TestGame.ToBePorted
|
||||||
import Mathlib.Algebra.BigOperators.Fin
|
import Mathlib.Algebra.BigOperators.Fin
|
||||||
import Mathlib.Tactic.Ring
|
import Mathlib.Tactic.Ring
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import TestGame.Metadata
|
import TestGame.Metadata
|
||||||
|
|
||||||
import TestGame.Options.BigOperators
|
import TestGame.ToBePorted
|
||||||
import Mathlib.Algebra.BigOperators.Fin
|
import Mathlib.Algebra.BigOperators.Fin
|
||||||
import Mathlib.Tactic.Ring
|
import Mathlib.Tactic.Ring
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import TestGame.Metadata
|
import TestGame.Metadata
|
||||||
|
|
||||||
import TestGame.Options.BigOperators
|
import TestGame.ToBePorted
|
||||||
import Mathlib.Algebra.BigOperators.Fin
|
import Mathlib.Algebra.BigOperators.Fin
|
||||||
import Mathlib.Tactic.Ring
|
import Mathlib.Tactic.Ring
|
||||||
|
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import TestGame.Metadata
|
import TestGame.Metadata
|
||||||
|
|
||||||
import TestGame.Options.BigOperators
|
import TestGame.ToBePorted
|
||||||
import Mathlib.Algebra.BigOperators.Fin
|
import Mathlib.Algebra.BigOperators.Fin
|
||||||
|
|
||||||
set_option tactic.hygienic false
|
set_option tactic.hygienic false
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import TestGame.Metadata
|
import TestGame.Metadata
|
||||||
|
|
||||||
import TestGame.Options.BigOperators
|
import TestGame.ToBePorted
|
||||||
import Mathlib.Algebra.BigOperators.Fin
|
import Mathlib.Algebra.BigOperators.Fin
|
||||||
|
|
||||||
set_option tactic.hygienic false
|
set_option tactic.hygienic false
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
import TestGame.Metadata
|
import TestGame.Metadata
|
||||||
|
|
||||||
import TestGame.Options.BigOperators
|
import TestGame.ToBePorted
|
||||||
import Mathlib.Algebra.BigOperators.Fin
|
import Mathlib.Algebra.BigOperators.Fin
|
||||||
import Mathlib.Tactic.Ring
|
import Mathlib.Tactic.Ring
|
||||||
|
|
||||||
|
|||||||
@@ -1,17 +0,0 @@
|
|||||||
import Mathlib.Algebra.BigOperators.Fin
|
|
||||||
|
|
||||||
open BigOperators
|
|
||||||
|
|
||||||
open Lean PrettyPrinter Delaborator SubExpr
|
|
||||||
|
|
||||||
@[ delab app.Finset.sum]
|
|
||||||
def delabFinsetSum : Delab := do
|
|
||||||
guard $ (← getExpr).getAppNumArgs == 5
|
|
||||||
guard $ ((← getExpr).getArg! 3).isAppOf' ``Finset.univ
|
|
||||||
guard $ ((← getExpr).getArg! 4).isLambda
|
|
||||||
withNaryArg 4 do
|
|
||||||
let α ← withBindingDomain delab
|
|
||||||
withBindingBodyUnusedName fun n => do
|
|
||||||
let n : TSyntax `ident := ⟨n⟩
|
|
||||||
let b ← delab
|
|
||||||
`(∑ $n:ident : $α, $b)
|
|
||||||
@@ -1,5 +1,28 @@
|
|||||||
import Mathlib
|
import Mathlib
|
||||||
|
|
||||||
|
open BigOperators
|
||||||
|
|
||||||
|
/-! # Delab Problems -/
|
||||||
|
|
||||||
|
open Lean PrettyPrinter Delaborator SubExpr
|
||||||
|
|
||||||
|
@[delab app.Finset.sum]
|
||||||
|
def delabFinsetSum : Delab := do
|
||||||
|
guard $ (← getExpr).getAppNumArgs == 5
|
||||||
|
guard $ ((← getExpr).getArg! 3).isAppOf' ``Finset.univ
|
||||||
|
guard $ ((← getExpr).getArg! 4).isLambda
|
||||||
|
withNaryArg 4 do
|
||||||
|
let α ← withBindingDomain delab
|
||||||
|
withBindingBodyUnusedName fun n => do
|
||||||
|
let n : TSyntax `ident := ⟨n⟩
|
||||||
|
let b ← delab
|
||||||
|
`(∑ $n:ident : $α, $b)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
/-! # Other Stuff -/
|
||||||
|
|
||||||
-- lemma not_odd {n : ℕ} : ¬ Odd n ↔ Even n := by
|
-- lemma not_odd {n : ℕ} : ¬ Odd n ↔ Even n := by
|
||||||
-- sorry
|
-- sorry
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user