Files
cannorin.net/packages/kripke/tests/utils.ts
dependabot[bot] 5e03187405 build(deps-dev): bump @biomejs/biome from 1.9.4 to 2.3.3 (#108)
* build(deps-dev): bump @biomejs/biome from 1.9.4 to 2.3.3

Bumps [@biomejs/biome](https://github.com/biomejs/biome/tree/HEAD/packages/@biomejs/biome) from 1.9.4 to 2.3.3.
- [Release notes](https://github.com/biomejs/biome/releases)
- [Changelog](https://github.com/biomejs/biome/blob/main/packages/@biomejs/biome/CHANGELOG.md)
- [Commits](https://github.com/biomejs/biome/commits/@biomejs/biome@2.3.3/packages/@biomejs/biome)

---
updated-dependencies:
- dependency-name: "@biomejs/biome"
  dependency-version: 2.3.3
  dependency-type: direct:development
  update-type: version-update:semver-major
...

Signed-off-by: dependabot[bot] <support@github.com>

* fix

---------

Signed-off-by: dependabot[bot] <support@github.com>
Co-authored-by: dependabot[bot] <49699333+dependabot[bot]@users.noreply.github.com>
Co-authored-by: cannorin <cannorin@users.noreply.github.com>
2025-11-16 03:12:18 +09:00

112 lines
2.6 KiB
TypeScript

import { sample } from "@cannorin/utils";
import { parse } from "../src/parser";
import { getFrame, nontrivials } from "../src/semantics";
import {
and,
bot,
box,
diamond,
eq,
type Formula,
not,
or,
propvar,
to,
top,
} from "../src/syntax";
const formulaTypes = [
"top",
"bot",
"propvar",
"not",
"and",
"or",
"to",
"eq",
"box",
"diamond",
] as const satisfies Formula["type"][];
export const testFormulas: Formula[] = [
parse("L(p -> q) -> (Lp -> Lq)"),
parse("Lp -> p"),
parse("LLp -> Lp"),
parse("Lp -> LLp"),
parse("Lp -> Mp"),
parse("p -> LMp"),
parse("Mp -> LMp"),
parse("L(Lp -> p) -> Lp"),
parse("L(L(p -> Lp) -> p) -> p"),
parse("L(Lp -> q) v L(Lq -> p)"),
parse("LMp -> MLp"),
parse("MLp -> LMp"),
parse("p -> Lp"),
parse("Mp -> Lp"),
parse("Mp <-> Lp"),
parse("Lp"),
parse("Lp v L(p -> q)"),
parse("Lp v L(p -> q) v L(p&q -> r)"),
parse("L(Lp -> p)"),
parse("LLp -> p"),
parse("p -> LLp"),
parse("M(p -> Mp)"),
parse("r -> M((p -> Mp) & Mr)"),
parse("p -> MMp"),
parse("M(p -> Lp)"),
parse("L0"),
parse("ML0"),
parse("L(p -> Mp)"),
parse("p -> MMMp"),
parse("p -> MMMMp"),
parse("M1"),
parse("ML(p -> Mp)"),
parse("Lp -> LMp"),
parse("M(p -> LLp)"),
// pathological
parse("L(M(1 & p) v LM1) -> (s <-> 1)"),
parse("L(M((q v ~q) & p) v LM(s v ~s)) -> (s <-> (p v ~p))"),
parse("~(Lr & ¬Mp) & M~L(q v q)"),
];
export function randomFormula(depth = 5): Formula {
const types = new Map([
[5, ["not", "and", "or", "to", "eq", "box", "diamond"] as const],
[4, ["not", "and", "or", "to", "eq", "box", "diamond"] as const],
[0, ["top", "bot", "propvar", "propvar", "propvar", "propvar"] as const],
]);
const type = sample(types.get(depth) ?? formulaTypes);
switch (type) {
case "top":
return top;
case "bot":
return bot;
case "propvar":
return propvar(sample(["p", "q", "r"]));
case "not":
return not(randomFormula(depth - 1));
case "and":
return and(randomFormula(depth - 1), randomFormula(depth - 1));
case "or":
return or(randomFormula(depth - 1), randomFormula(depth - 1));
case "to":
return to(randomFormula(depth - 1), randomFormula(depth - 1));
case "eq":
return eq(randomFormula(depth - 1), randomFormula(depth - 1));
case "box":
return box(randomFormula(depth - 1));
case "diamond":
return diamond(randomFormula(depth - 1));
default:
throw new Error(`impossible: ${type}`);
}
}
export function randomFrame() {
return getFrame(sample(nontrivials));
}