@proposit/proposit-core 4.0.0 → 4.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -4,14 +4,17 @@ import { DERIVATION_STRUCTURE_INVALID } from "../types/validation.js";
4
4
  * Validate that a derivation premise's expression tree conforms to the
5
5
  * structural rules in the v0.11.0 spec:
6
6
  *
7
- * - Root must be either a single variable expression for the derived
8
- * claim's variable (naked form), or an `implies`/`iff` operator with
7
+ * - Root must be either a single variable expression for a variable bound
8
+ * to the derived claim (naked form), or an `implies`/`iff` operator with
9
9
  * arity 2.
10
10
  * - When the root is `implies`/`iff`:
11
11
  * - position 0 (antecedent slot) is any valid expression tree.
12
- * - position 1 (consequent slot) is exactly the variable expression
13
- * for the derived claim's variable. No operator subtree, no other
14
- * variable, no formula wrapper.
12
+ * - position 1 (consequent slot) is exactly a variable expression for
13
+ * a variable bound to the derived claim. No operator subtree, no
14
+ * variable bound elsewhere, no formula wrapper.
15
+ *
16
+ * A claim may bind more than one variable, and each of them stands for that
17
+ * claim — so any of them satisfies the consequent slot.
15
18
  *
16
19
  * Returns a `TInvariantValidationResult` with one violation per detected
17
20
  * rule break, all using `DERIVATION_STRUCTURE_INVALID` (the message
@@ -22,9 +25,14 @@ import { DERIVATION_STRUCTURE_INVALID } from "../types/validation.js";
22
25
  */
23
26
  export function validateDerivationStructure(premise, expressions, variables) {
24
27
  const violations = [];
25
- // 1. Locate the claim-bound variable for derivedClaimId.
26
- const consequentVariable = variables.find((v) => isClaimBound(v) && v.claimId === premise.derivedClaimId);
27
- if (consequentVariable === undefined) {
28
+ // 1. Locate the claim-bound variables for derivedClaimId. A claim may bind
29
+ // more than one, and each of them stands for the derived claim — so the
30
+ // consequent slot naming any of them is well-formed. Matching only the
31
+ // first would call a correct premise malformed on nothing but id order.
32
+ const consequentVariableIds = new Set(variables
33
+ .filter((v) => isClaimBound(v) && v.claimId === premise.derivedClaimId)
34
+ .map((v) => v.id));
35
+ if (consequentVariableIds.size === 0) {
28
36
  violations.push({
29
37
  entityType: "premise",
30
38
  entityId: premise.id,
@@ -55,14 +63,15 @@ export function validateDerivationStructure(premise, expressions, variables) {
55
63
  }
56
64
  const root = rootExpressions[0];
57
65
  // 3. Validate root shape.
58
- // Naked form: root is a variable expression for the derived claim's variable.
66
+ // Naked form: root is a variable expression for a variable bound to the
67
+ // derived claim.
59
68
  if (root.type === "variable") {
60
- if (root.variableId !== consequentVariable.id) {
69
+ if (!consequentVariableIds.has(root.variableId)) {
61
70
  violations.push({
62
71
  entityType: "premise",
63
72
  entityId: premise.id,
64
73
  code: DERIVATION_STRUCTURE_INVALID,
65
- message: `Naked-form root variable ${root.variableId} does not reference derivedClaimId's variable ${consequentVariable.id}`,
74
+ message: `Naked-form root variable ${root.variableId} is not bound to derivedClaimId ${premise.derivedClaimId} (bound variables: ${[...consequentVariableIds].join(", ")})`,
66
75
  });
67
76
  }
68
77
  return { ok: violations.length === 0, violations };
@@ -84,12 +93,12 @@ export function validateDerivationStructure(premise, expressions, variables) {
84
93
  }
85
94
  const consequent = children[1];
86
95
  if (consequent.type !== "variable" ||
87
- consequent.variableId !== consequentVariable.id) {
96
+ !consequentVariableIds.has(consequent.variableId)) {
88
97
  violations.push({
89
98
  entityType: "premise",
90
99
  entityId: premise.id,
91
100
  code: DERIVATION_STRUCTURE_INVALID,
92
- message: "Consequent slot (position 1) must be the variable expression for derivedClaimId's variable",
101
+ message: "Consequent slot (position 1) must be a variable expression for a variable bound to derivedClaimId",
93
102
  });
94
103
  }
95
104
  return { ok: violations.length === 0, violations };
@@ -1 +1 @@
1
- {"version":3,"file":"derivation-validation.js","sourceRoot":"","sources":["../../../src/lib/utils/derivation-validation.ts"],"names":[],"mappings":"AAKA,OAAO,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAA;AAE3D,OAAO,EAAE,4BAA4B,EAAE,MAAM,wBAAwB,CAAA;AAErE;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,UAAU,2BAA2B,CACvC,OAA+B,EAC/B,WAA2C,EAC3C,SAAuC;IAEvC,MAAM,UAAU,GAA6C,EAAE,CAAA;IAE/D,yDAAyD;IACzD,MAAM,kBAAkB,GAAG,SAAS,CAAC,IAAI,CACrC,CAAC,CAAC,EAAE,EAAE,CAAC,YAAY,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,OAAO,KAAK,OAAO,CAAC,cAAc,CACjE,CAAA;IACD,IAAI,kBAAkB,KAAK,SAAS,EAAE,CAAC;QACnC,UAAU,CAAC,IAAI,CAAC;YACZ,UAAU,EAAE,SAAS;YACrB,QAAQ,EAAE,OAAO,CAAC,EAAE;YACpB,IAAI,EAAE,4BAA4B;YAClC,OAAO,EAAE,8CAA8C,OAAO,CAAC,cAAc,mBAAmB;SACnG,CAAC,CAAA;QACF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,CAAA;IACpC,CAAC;IAED,oEAAoE;IACpE,MAAM,eAAe,GAAG,WAAW,CAAC,MAAM,CACtC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,SAAS,KAAK,OAAO,CAAC,EAAE,IAAI,CAAC,CAAC,QAAQ,KAAK,IAAI,CAC3D,CAAA;IACD,IAAI,eAAe,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;QAC/B,UAAU,CAAC,IAAI,CAAC;YACZ,UAAU,EAAE,SAAS;YACrB,QAAQ,EAAE,OAAO,CAAC,EAAE;YACpB,IAAI,EAAE,4BAA4B;YAClC,OAAO,EAAE,2CAA2C;SACvD,CAAC,CAAA;QACF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,CAAA;IACpC,CAAC;IACD,IAAI,eAAe,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;QAC7B,UAAU,CAAC,IAAI,CAAC;YACZ,UAAU,EAAE,SAAS;YACrB,QAAQ,EAAE,OAAO,CAAC,EAAE;YACpB,IAAI,EAAE,4BAA4B;YAClC,OAAO,EAAE,kDAAkD;SAC9D,CAAC,CAAA;QACF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,CAAA;IACpC,CAAC;IACD,MAAM,IAAI,GAAG,eAAe,CAAC,CAAC,CAAC,CAAA;IAE/B,0BAA0B;IAE1B,8EAA8E;IAC9E,IAAI,IAAI,CAAC,IAAI,KAAK,UAAU,EAAE,CAAC;QAC3B,IAAI,IAAI,CAAC,UAAU,KAAK,kBAAkB,CAAC,EAAE,EAAE,CAAC;YAC5C,UAAU,CAAC,IAAI,CAAC;gBACZ,UAAU,EAAE,SAAS;gBACrB,QAAQ,EAAE,OAAO,CAAC,EAAE;gBACpB,IAAI,EAAE,4BAA4B;gBAClC,OAAO,EAAE,4BAA4B,IAAI,CAAC,UAAU,iDAAiD,kBAAkB,CAAC,EAAE,EAAE;aAC/H,CAAC,CAAA;QACN,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,UAAU,EAAE,CAAA;IACtD,CAAC;IAED,uEAAuE;IACvE,IACI,IAAI,CAAC,IAAI,KAAK,UAAU;QACxB,CAAC,IAAI,CAAC,QAAQ,KAAK,SAAS,IAAI,IAAI,CAAC,QAAQ,KAAK,KAAK,CAAC,EAC1D,CAAC;QACC,MAAM,QAAQ,GAAG,WAAW;aACvB,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,KAAK,IAAI,CAAC,EAAE,CAAC;aACrC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,QAAQ,GAAG,CAAC,CAAC,QAAQ,CAAC,CAAA;QAE5C,IAAI,QAAQ,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACxB,UAAU,CAAC,IAAI,CAAC;gBACZ,UAAU,EAAE,SAAS;gBACrB,QAAQ,EAAE,OAAO,CAAC,EAAE;gBACpB,IAAI,EAAE,4BAA4B;gBAClC,OAAO,EAAE,mBAAmB,IAAI,CAAC,QAAQ,2BAA2B,QAAQ,CAAC,MAAM,GAAG;aACzF,CAAC,CAAA;YACF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,CAAA;QACpC,CAAC;QAED,MAAM,UAAU,GAAG,QAAQ,CAAC,CAAC,CAAC,CAAA;QAC9B,IACI,UAAU,CAAC,IAAI,KAAK,UAAU;YAC9B,UAAU,CAAC,UAAU,KAAK,kBAAkB,CAAC,EAAE,EACjD,CAAC;YACC,UAAU,CAAC,IAAI,CAAC;gBACZ,UAAU,EAAE,SAAS;gBACrB,QAAQ,EAAE,OAAO,CAAC,EAAE;gBACpB,IAAI,EAAE,4BAA4B;gBAClC,OAAO,EACH,4FAA4F;aACnG,CAAC,CAAA;QACN,CAAC;QACD,OAAO,EAAE,EAAE,EAAE,UAAU,CAAC,MAAM,KAAK,CAAC,EAAE,UAAU,EAAE,CAAA;IACtD,CAAC;IAED,yEAAyE;IACzE,MAAM,QAAQ,GAAG,IAAI,CAAC,IAAI,KAAK,UAAU,CAAC,CAAC,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAA;IACrE,UAAU,CAAC,IAAI,CAAC;QACZ,UAAU,EAAE,SAAS;QACrB,QAAQ,EAAE,OAAO,CAAC,EAAE;QACpB,IAAI,EAAE,4BAA4B;QAClC,OAAO,EAAE,sFAAsF,QAAQ,GAAG;KAC7G,CAAC,CAAA;IACF,OAAO,EAAE,EAAE,EAAE,KAAK,EAAE,UAAU,EAAE,CAAA;AACpC,CAAC"}
1
+ {"version":3,"file":"derivation-validation.js","sourceRoot":"","sources":["../../../src/lib/utils/derivation-validation.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@proposit/proposit-core",
3
- "version": "4.0.0",
3
+ "version": "4.1.0",
4
4
  "description": "Core engine for building and manipulating propositional logic arguments.",
5
5
  "license": "MIT",
6
6
  "keywords": [