{"version":3,"sources":["logic.ts"],"sourcesContent":["\n// parent class for &,| value compositions (logical formulas)\n// CNF\n\nimport type { Class } from \"../utils/global_types.ts\";\nimport { Runtime } from \"../runtime/runtime.ts\";\nimport { ReactiveValue } from \"../runtime/pointers.ts\";\n\nimport { RuntimeError } from \"./errors.ts\";\nimport { Assertion } from \"./assertion.ts\";\nimport { Type } from \"./type.ts\";\nimport { Datex } from \"../mod.ts\";\n\nexport type literal<T> = T|Negation<T>|Assertion<T>; // x, ~x\ntype cnf_disjunction<T> = Disjunction<literal<T>>|literal<T>; // x, x|y, x|~y, ...\nexport type cnf<T> = Conjunction<cnf_disjunction<T>>; // (x|y) & (z) & ...\n\nexport type clause<T> = literal<T>|Logical<clause<T>>\n\n\nexport interface LogicalComparator<T> {\n\tlogicalMatch(value:T, against:T): boolean\n}\n\n// parent class for and, or, not\nexport class Logical<T> extends Set<T> {\n\n\tconstructor(values?: T[]|[T]) {\n\t\t// ignore 'undefined' values\n\t\tsuper(values?.filter(v=>v!==undefined))\n\t}\n\n\n\t// create new conjunction\n\tand(value:T):Conjunction<clause<T>> {\n\t\treturn new Conjunction<clause<T>>(this, value);\n\t}\n\n\t// create new disjunction\n\tor(value:T):Disjunction<clause<T>> {\n\t\treturn new Disjunction<clause<T>>(this, value);\n\t}\n\n\t// create new negation\n\tnot():Negation<clause<T>>|T {\n\t\tif (this instanceof Negation) return [...this][0]; // double negation\n\t\telse return new Negation<clause<T>>(this);\n\t}\n\n\tprotected sampleValue():T|void{\n\t\tif (this.size) {\n\t\t\tconst first = [...this][0];\n\t\t\tif (first instanceof Logical) return first.sampleValue();\n\t\t\telse return first;\n\t\t}\n\t}\n\n\toverride toString(){\n\t\treturn Runtime.valueToDatexString(this);\n\t}\n\n\t// value clause matches against other clause\n\t// if no atomic_class is provided, the first value clause literal is used to determine a atomic class\n    public static matches<T>(value:clause<T>, against:clause<T>, atomic_class?:Class<T>&LogicalComparator<T>, assertionValue = value, throwInvalidAssertion = false): boolean {\n\n\t\t// TODO: empty - does not match?\n\t\tif (against === undefined) return false;\n\n\t\tvalue = <clause<T>> Datex.ReactiveValue.collapseValue(value, true, true);\n\t\tagainst = <clause<T>> Datex.ReactiveValue.collapseValue(against, true, true);\n\n\t\t// auto infer atomic class\n\t\tif (atomic_class === undefined) {\n\t\t\tconst atomic_value = (value instanceof Logical ? (<Logical<clause<T>>>value).sampleValue() : value) ?? (against instanceof Logical ? (<Logical<clause<T>>>against).sampleValue() : against);\n\t\t\tatomic_class = (<any>atomic_value)?.constructor;\n\t\t\tif (typeof atomic_class != \"function\" || !atomic_class.logicalMatch) throw new RuntimeError(\"Could not infer valid atomic type for match check\");\n\t\t}\n\n\t\tif (typeof atomic_class != \"function\" || !atomic_class.logicalMatch) throw new RuntimeError(\"Invalid atomic type for match check\");\n\n        // or (all parts must match)\n        if (value instanceof Disjunction) {\n\t\t\t//  TODO: empty disjunction == any?\n\t\t\tif (value.size == 0) return true;\n\n            for (const p of value) {\n                if (!(this.matches(p, against, atomic_class, assertionValue, throwInvalidAssertion))) return false; \n            }\n            return true;\n        }\n        // and (any part must match)\n        if (value instanceof Conjunction) {\n\t\t\t//  TODO: empty disjunction == any?\n\t\t\tif (value.size == 0) return true;\n\t\t\t\n            for (const p of value) {\n                if (this.matches(p, against, atomic_class, assertionValue, throwInvalidAssertion)) return true;\n            }\n            return false;\n        }\n        // not\n        if (value instanceof Negation) {\n            return !this.matches(value.not(), against, atomic_class, assertionValue, throwInvalidAssertion)\n        }\n\n\t\t// assertion\n\t\tif (value instanceof Assertion) {\n\t\t\tthrow \"TODO asssertion\";\n\t\t\t// if (res instanceof Promise) throw new RuntimeError(\"async assertion cannot be evaluated in logical connective\");\n\t\t\t// return res\n\t\t}\n        \n\t\t// default\n\t\treturn this.matchesSingle(<T>ReactiveValue.collapseValue(value, true, true), against, atomic_class, assertionValue, throwInvalidAssertion);\n        \n    }\n\n    private static matchesSingle<T>(atomic_value:T, against: clause<T>, atomic_class:Class<T>&LogicalComparator<T>, assertionValue = atomic_value, throwInvalidAssertion = false): boolean {\n\n\t\tatomic_value = <T> Datex.ReactiveValue.collapseValue(atomic_value, true, true);\n\t\tagainst = <clause<T>> Datex.ReactiveValue.collapseValue(against, true, true);\n\n\t\t// wrong atomic type for atomic_value at runtime\n\t\tif (atomic_class && !(atomic_value instanceof atomic_class)) throw new RuntimeError(`Invalid match check: atomic value has wrong type (expected ${Type.getClassDatexType(atomic_class)}, found ${Type.ofValue(atomic_value)})`);\n\n        // or\n        if (against instanceof Disjunction) {\n\t\t\t//  TODO:empty disjunction == any?\n\t\t\tif (against.size == 0) return true;\n            for (const t of against) {\n                if (this.matchesSingle(atomic_value, t, atomic_class, assertionValue, throwInvalidAssertion)) return true; // any type matches\n            }\n            return false;\n        }\n        // and\n        if (against instanceof Conjunction) {\n            for (const t of against) {\n                if (!this.matchesSingle(atomic_value, t, atomic_class, assertionValue, throwInvalidAssertion)) return false; // any type does not match\n            }\n            return true;\n        }\n        // not\n        if (against instanceof Negation) {\n            return !this.matchesSingle(atomic_value, against.not(), atomic_class, assertionValue, throwInvalidAssertion)\n        }\n\n\t\t// assertion\n\t\tif (against instanceof Assertion) {\n\t\t\tconst res = against.assert(assertionValue, undefined, !throwInvalidAssertion);\n\t\t\tif (res instanceof Promise) throw new RuntimeError(\"async assertion cannot be evaluated in logical connective\");\n\t\t\treturn res\n\t\t}\n\n\n\t\t// wrong atomic type at runtime\n\t\t// guard for: against is T\n\t\tif (!(against instanceof atomic_class)) {\n\t\t\tconsole.error(`Invalid match check: atomic value has wrong type (expected ${Type.getClassDatexType(atomic_class)}, found ${Type.ofValue(against)})`)\n\t\t\t// throw new RuntimeError(`Invalid match check: atomic value has wrong type (expected ${Type.getClassDatexType(atomic_class)}, found ${Type.ofValue(against)})`);\n\t\t\treturn true;\n\t\t}\n\n\t\t// match\n\t\treturn atomic_class.logicalMatch(<T>ReactiveValue.collapseValue(atomic_value, true, true), <T>against);\n    }\n\n\n\t// collapse clause to list\n\tpublic static collapse<T>(value:clause<T>, atomic_class:Class<T>&LogicalComparator<T>): Disjunction<T> {\n\t\tconst list = new Disjunction<T>();\n\n\t\tthis.addToCollapseList(value, atomic_class, list);\n\n\t\treturn list;\n\t}\n\n\tprivate static addToCollapseList<T>(value:clause<T>, atomic_class:Class<T>&LogicalComparator<T>, list:Disjunction<T>) {\n\n\t\tif (typeof atomic_class != \"function\" || !atomic_class.logicalMatch) throw new RuntimeError(\"Invalid atomic type for logical collapse\");\n\n        // or: add every value\n        if (value instanceof Disjunction) {\n            for (const p of value) {\n\t\t\t\tif (!this.addToCollapseList(p, atomic_class, list)) return false; // recursive and possible early cancel\n            }\n            return true;\n        }\n        // and\n        if (value instanceof Conjunction) {\n            for (const p of value) {\n\t\t\t\t// TODO: calculate intersection\n\t\t\t\t// and contradiction\n                if (!this.matches(p, list, atomic_class)) {\n\t\t\t\t\tlist.clear();\n\t\t\t\t\treturn false; \n\t\t\t\t}\n\t\t\t\t// add\n\t\t\t\tif (!this.addToCollapseList(p, atomic_class, list)) return false; // recursive and possible early cancel\n            }\n            return true;\n        }\n        // not\n        if (value instanceof Negation) {\n            return false // TODO:\n        }\n        \n\t\t// default\n\n\t\tvalue = <T>ReactiveValue.collapseValue(value, true, true)\n\t\tif (!(value instanceof atomic_class)) throw new RuntimeError(`logical collapse: atomic value has wrong type (expected ${Type.getClassDatexType(atomic_class)}, found ${Type.ofValue(value)})`);\n\n\t\tlist.add(<T>value);\n\n\t\treturn true;\n\t}\n}\n\n// ~value\nexport class Negation<T> extends Logical<T> {\n\t// only a single value\n\tconstructor(value:T) {\n\t\tsuper([value]);\n\t}\n\n}\n\n// logical connective (\"and\" or \"or\")\nexport abstract class Connective<T> extends Logical<T> {\n\tconstructor(...values:T[]|[T]) {\n\t\tsuper(values);\n\t}\n}\n\n// x & y\nexport class Conjunction<T> extends Connective<T> {\n\n\t// change internally\n\tappendAnd(value:T) {\n\t\tthis.add(value);\n\t}\n\t\n}\n\n// x | y\nexport class Disjunction<T> extends Connective<T> {\n\n\t// change internally\n\tappendOr(value:T) {\n\t\tthis.add(value);\n\t}\n\n}"],"names":["Runtime","ReactiveValue","RuntimeError","Assertion","Type","Datex","Logical","Set","constructor","values","filter","v","undefined","and","value","Conjunction","or","Disjunction","not","Negation","sampleValue","size","first","toString","valueToDatexString","matches","against","atomic_class","assertionValue","throwInvalidAssertion","collapseValue","atomic_value","logicalMatch","p","matchesSingle","getClassDatexType","ofValue","t","res","assert","Promise","console","error","collapse","list","addToCollapseList","clear","add","Connective","appendAnd","appendOr"],"mappings":"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","sourceRoot":"/lib/datex-core-js-legacy-0.3.15/types/","file":"logic.ts"}