From 960c5323ed21b8ac5d0e62e420751cc5a5e711cf Mon Sep 17 00:00:00 2001 From: cannorin Date: Tue, 18 Feb 2025 07:29:45 +0900 Subject: [PATCH] kripke: add frame input --- apps/web/src/routes/kripke/+page.svelte | 23 ++- .../src/routes/kripke/formula-input.svelte | 3 +- apps/web/src/routes/kripke/frame-input.svelte | 176 ++++++++++++++++++ apps/web/src/routes/kripke/vector.ts | 28 +++ packages/kripke/semantics.ts | 12 +- 5 files changed, 232 insertions(+), 10 deletions(-) create mode 100644 apps/web/src/routes/kripke/frame-input.svelte create mode 100644 apps/web/src/routes/kripke/vector.ts diff --git a/apps/web/src/routes/kripke/+page.svelte b/apps/web/src/routes/kripke/+page.svelte index 69ee43f..1f71da3 100644 --- a/apps/web/src/routes/kripke/+page.svelte +++ b/apps/web/src/routes/kripke/+page.svelte @@ -1,17 +1,32 @@ -
- +
- +

KRiPkE

+ +
+
+ + +
+ + +
diff --git a/apps/web/src/routes/kripke/formula-input.svelte b/apps/web/src/routes/kripke/formula-input.svelte index 03257ce..62adb1a 100644 --- a/apps/web/src/routes/kripke/formula-input.svelte +++ b/apps/web/src/routes/kripke/formula-input.svelte @@ -20,6 +20,7 @@ $effect(() => { diff --git a/apps/web/src/routes/kripke/frame-input.svelte b/apps/web/src/routes/kripke/frame-input.svelte new file mode 100644 index 0000000..bd412c2 --- /dev/null +++ b/apps/web/src/routes/kripke/frame-input.svelte @@ -0,0 +1,176 @@ + + + + + + + + + + + + + + {#each Array.from(relations) as rel} + {#key rel} + handleEdgeClick(rel, e)} + /> + {/key} + {/each} + + {#each worlds as w} + {@const x = positions[w].x} + {@const y = positions[w].y} + handleNodeClick(w, e)} + /> + {/each} + diff --git a/apps/web/src/routes/kripke/vector.ts b/apps/web/src/routes/kripke/vector.ts new file mode 100644 index 0000000..c9f3f54 --- /dev/null +++ b/apps/web/src/routes/kripke/vector.ts @@ -0,0 +1,28 @@ +export type Vector = { + x: number; + y: number; +}; + +export type Radian = number; + +export const degree = (value: number) => ((value / 180) * Math.PI) as Radian; + +export const sub = (v1: Vector, v2: Vector) => + ({ + x: v1.x - v2.x, + y: v1.y - v2.y, + }) as Vector; + +export const add = (v1: Vector, v2: Vector) => + ({ + x: v1.x + v2.x, + y: v1.y + v2.y, + }) as Vector; + +export const theta = ({ x, y }: Vector) => Math.atan2(y, x) as Radian; + +export const rotate = ({ x, y }: Vector, rad: Radian) => + ({ + x: x * Math.cos(rad) - y * Math.sin(rad), + y: x * Math.sin(rad) + y * Math.cos(rad), + }) as Vector; diff --git a/packages/kripke/semantics.ts b/packages/kripke/semantics.ts index 01abe67..9cfcff4 100644 --- a/packages/kripke/semantics.ts +++ b/packages/kripke/semantics.ts @@ -8,6 +8,8 @@ export type World = (typeof worlds)[number]; export type Relation = `${World}${World}`; export const left = (rel: Relation) => rel[0] as World; export const right = (rel: Relation) => rel[1] as World; +export const reverse = (rel: Relation) => + `${right(rel)}${left(rel)}` as Relation; export const relation: Relation[] = worlds.flatMap((w) => worlds.map((x) => `${w}${x}` as const), @@ -148,15 +150,15 @@ export function generateAllFrames() { } } - const mapping: Uint16Array = new Uint16Array(total); + const isomorphic: Uint16Array = new Uint16Array(total); for (let id = 0; id < total; id++) { const value = map.get(id); if (value === undefined) throw Error(`impossible (${id})`); - mapping[id] = value; + isomorphic[id] = value; } - return { canonicals, mapping }; + return { canonicals, isomorphic }; } -const { canonicals, mapping } = generateAllFrames(); -export { canonicals, mapping }; +const { canonicals, isomorphic } = generateAllFrames(); +export { canonicals, isomorphic };