@cogitator-ai/neuro-symbolic 0.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.
Files changed (107) hide show
  1. package/LICENSE +21 -0
  2. package/README.md +494 -0
  3. package/dist/constraints/dsl.d.ts +68 -0
  4. package/dist/constraints/dsl.d.ts.map +1 -0
  5. package/dist/constraints/dsl.js +419 -0
  6. package/dist/constraints/dsl.js.map +1 -0
  7. package/dist/constraints/index.d.ts +7 -0
  8. package/dist/constraints/index.d.ts.map +1 -0
  9. package/dist/constraints/index.js +18 -0
  10. package/dist/constraints/index.js.map +1 -0
  11. package/dist/constraints/prompts.d.ts +44 -0
  12. package/dist/constraints/prompts.d.ts.map +1 -0
  13. package/dist/constraints/prompts.js +175 -0
  14. package/dist/constraints/prompts.js.map +1 -0
  15. package/dist/constraints/simple-sat-solver.d.ts +21 -0
  16. package/dist/constraints/simple-sat-solver.d.ts.map +1 -0
  17. package/dist/constraints/simple-sat-solver.js +378 -0
  18. package/dist/constraints/simple-sat-solver.js.map +1 -0
  19. package/dist/constraints/z3-wasm-solver.d.ts +20 -0
  20. package/dist/constraints/z3-wasm-solver.d.ts.map +1 -0
  21. package/dist/constraints/z3-wasm-solver.js +286 -0
  22. package/dist/constraints/z3-wasm-solver.js.map +1 -0
  23. package/dist/index.d.ts +6 -0
  24. package/dist/index.d.ts.map +1 -0
  25. package/dist/index.js +6 -0
  26. package/dist/index.js.map +1 -0
  27. package/dist/knowledge-graph/index.d.ts +5 -0
  28. package/dist/knowledge-graph/index.d.ts.map +1 -0
  29. package/dist/knowledge-graph/index.js +5 -0
  30. package/dist/knowledge-graph/index.js.map +1 -0
  31. package/dist/knowledge-graph/natural-language-query.d.ts +42 -0
  32. package/dist/knowledge-graph/natural-language-query.d.ts.map +1 -0
  33. package/dist/knowledge-graph/natural-language-query.js +271 -0
  34. package/dist/knowledge-graph/natural-language-query.js.map +1 -0
  35. package/dist/knowledge-graph/prompts.d.ts +56 -0
  36. package/dist/knowledge-graph/prompts.d.ts.map +1 -0
  37. package/dist/knowledge-graph/prompts.js +198 -0
  38. package/dist/knowledge-graph/prompts.js.map +1 -0
  39. package/dist/knowledge-graph/query-language.d.ts +43 -0
  40. package/dist/knowledge-graph/query-language.d.ts.map +1 -0
  41. package/dist/knowledge-graph/query-language.js +569 -0
  42. package/dist/knowledge-graph/query-language.js.map +1 -0
  43. package/dist/knowledge-graph/reasoning-engine.d.ts +53 -0
  44. package/dist/knowledge-graph/reasoning-engine.d.ts.map +1 -0
  45. package/dist/knowledge-graph/reasoning-engine.js +337 -0
  46. package/dist/knowledge-graph/reasoning-engine.js.map +1 -0
  47. package/dist/logic/builtins.d.ts +10 -0
  48. package/dist/logic/builtins.d.ts.map +1 -0
  49. package/dist/logic/builtins.js +527 -0
  50. package/dist/logic/builtins.js.map +1 -0
  51. package/dist/logic/index.d.ts +8 -0
  52. package/dist/logic/index.d.ts.map +1 -0
  53. package/dist/logic/index.js +8 -0
  54. package/dist/logic/index.js.map +1 -0
  55. package/dist/logic/knowledge-base.d.ts +38 -0
  56. package/dist/logic/knowledge-base.d.ts.map +1 -0
  57. package/dist/logic/knowledge-base.js +205 -0
  58. package/dist/logic/knowledge-base.js.map +1 -0
  59. package/dist/logic/parser.d.ts +19 -0
  60. package/dist/logic/parser.d.ts.map +1 -0
  61. package/dist/logic/parser.js +466 -0
  62. package/dist/logic/parser.js.map +1 -0
  63. package/dist/logic/prompts.d.ts +55 -0
  64. package/dist/logic/prompts.d.ts.map +1 -0
  65. package/dist/logic/prompts.js +230 -0
  66. package/dist/logic/prompts.js.map +1 -0
  67. package/dist/logic/proof-tree.d.ts +30 -0
  68. package/dist/logic/proof-tree.d.ts.map +1 -0
  69. package/dist/logic/proof-tree.js +281 -0
  70. package/dist/logic/proof-tree.js.map +1 -0
  71. package/dist/logic/resolver.d.ts +16 -0
  72. package/dist/logic/resolver.d.ts.map +1 -0
  73. package/dist/logic/resolver.js +382 -0
  74. package/dist/logic/resolver.js.map +1 -0
  75. package/dist/logic/unification.d.ts +17 -0
  76. package/dist/logic/unification.d.ts.map +1 -0
  77. package/dist/logic/unification.js +257 -0
  78. package/dist/logic/unification.js.map +1 -0
  79. package/dist/orchestrator.d.ts +57 -0
  80. package/dist/orchestrator.d.ts.map +1 -0
  81. package/dist/orchestrator.js +293 -0
  82. package/dist/orchestrator.js.map +1 -0
  83. package/dist/planning/action-schema.d.ts +48 -0
  84. package/dist/planning/action-schema.d.ts.map +1 -0
  85. package/dist/planning/action-schema.js +358 -0
  86. package/dist/planning/action-schema.js.map +1 -0
  87. package/dist/planning/index.d.ts +6 -0
  88. package/dist/planning/index.d.ts.map +1 -0
  89. package/dist/planning/index.js +6 -0
  90. package/dist/planning/index.js.map +1 -0
  91. package/dist/planning/invariant-checker.d.ts +39 -0
  92. package/dist/planning/invariant-checker.d.ts.map +1 -0
  93. package/dist/planning/invariant-checker.js +293 -0
  94. package/dist/planning/invariant-checker.js.map +1 -0
  95. package/dist/planning/plan-repair.d.ts +38 -0
  96. package/dist/planning/plan-repair.d.ts.map +1 -0
  97. package/dist/planning/plan-repair.js +366 -0
  98. package/dist/planning/plan-repair.js.map +1 -0
  99. package/dist/planning/plan-validator.d.ts +31 -0
  100. package/dist/planning/plan-validator.d.ts.map +1 -0
  101. package/dist/planning/plan-validator.js +379 -0
  102. package/dist/planning/plan-validator.js.map +1 -0
  103. package/dist/planning/prompts.d.ts +50 -0
  104. package/dist/planning/prompts.d.ts.map +1 -0
  105. package/dist/planning/prompts.js +186 -0
  106. package/dist/planning/prompts.js.map +1 -0
  107. package/package.json +96 -0
@@ -0,0 +1,382 @@
1
+ import { nanoid } from 'nanoid';
2
+ import { unify, applySubstitution, renameVariables, getVariables, termToString, } from './unification';
3
+ import { isBuiltin, executeBuiltin } from './builtins';
4
+ import { parseQuery } from './parser';
5
+ function importParser() {
6
+ return { parseQuery };
7
+ }
8
+ function createProofNode(goal, subst, depth) {
9
+ return {
10
+ id: nanoid(8),
11
+ goal,
12
+ substitution: subst,
13
+ children: [],
14
+ status: 'pending',
15
+ depth,
16
+ };
17
+ }
18
+ function getDefaultConfig() {
19
+ return {
20
+ maxDepth: 50,
21
+ maxSolutions: 10,
22
+ timeout: 5000,
23
+ enableCut: true,
24
+ enableNegation: true,
25
+ traceExecution: false,
26
+ };
27
+ }
28
+ function checkTimeout(ctx) {
29
+ return Date.now() - ctx.startTime > ctx.config.timeout;
30
+ }
31
+ function resolve(state, ctx) {
32
+ ctx.exploredNodes++;
33
+ if (ctx.maxDepth < state.depth) {
34
+ ctx.maxDepth = state.depth;
35
+ }
36
+ if (checkTimeout(ctx)) {
37
+ state.proofNode.status = 'failure';
38
+ return { success: false };
39
+ }
40
+ if (state.depth > ctx.config.maxDepth) {
41
+ state.proofNode.status = 'failure';
42
+ return { success: false };
43
+ }
44
+ if (state.goals.length === 0) {
45
+ state.proofNode.status = 'success';
46
+ const solution = new Map();
47
+ for (const varName of ctx.queryVariables) {
48
+ const bound = state.substitution.get(varName);
49
+ if (bound) {
50
+ solution.set(varName, applySubstitution(bound, state.substitution));
51
+ }
52
+ }
53
+ ctx.solutions.push(solution);
54
+ return { success: true };
55
+ }
56
+ const [currentGoal, ...remainingGoals] = state.goals;
57
+ const resolvedGoal = applySubstitution(currentGoal, state.substitution);
58
+ if (ctx.config.enableCut && resolvedGoal.functor === '!' && resolvedGoal.args.length === 0) {
59
+ state.proofNode.status = 'cut';
60
+ const childNode = createProofNode(resolvedGoal, state.substitution, state.depth + 1);
61
+ childNode.status = 'cut';
62
+ state.proofNode.children.push(childNode);
63
+ const result = resolve({
64
+ goals: remainingGoals,
65
+ substitution: state.substitution,
66
+ depth: state.depth + 1,
67
+ proofNode: childNode,
68
+ cut: false,
69
+ }, ctx);
70
+ return { success: result.success, cut: true };
71
+ }
72
+ if (ctx.config.enableNegation &&
73
+ resolvedGoal.functor === '\\+' &&
74
+ resolvedGoal.args.length === 1 &&
75
+ resolvedGoal.args[0].type === 'compound') {
76
+ const negatedGoal = resolvedGoal.args[0];
77
+ const childNode = createProofNode(resolvedGoal, state.substitution, state.depth + 1);
78
+ state.proofNode.children.push(childNode);
79
+ const savedSolutions = ctx.solutions.length;
80
+ const testNode = createProofNode(negatedGoal, state.substitution, state.depth + 1);
81
+ const testResult = resolve({
82
+ goals: [negatedGoal],
83
+ substitution: state.substitution,
84
+ depth: state.depth + 1,
85
+ proofNode: testNode,
86
+ cut: false,
87
+ }, ctx);
88
+ ctx.solutions.length = savedSolutions;
89
+ if (!testResult.success) {
90
+ childNode.status = 'success';
91
+ return resolve({
92
+ goals: remainingGoals,
93
+ substitution: state.substitution,
94
+ depth: state.depth + 1,
95
+ proofNode: childNode,
96
+ cut: false,
97
+ }, ctx);
98
+ }
99
+ childNode.status = 'failure';
100
+ return { success: false };
101
+ }
102
+ if (resolvedGoal.functor === ',' && resolvedGoal.args.length === 2) {
103
+ const [first, second] = resolvedGoal.args;
104
+ if (first.type === 'compound' && second.type === 'compound') {
105
+ const newGoals = [first, second, ...remainingGoals];
106
+ return resolve({
107
+ goals: newGoals,
108
+ substitution: state.substitution,
109
+ depth: state.depth,
110
+ proofNode: state.proofNode,
111
+ cut: false,
112
+ }, ctx);
113
+ }
114
+ }
115
+ if (resolvedGoal.functor === ';' && resolvedGoal.args.length === 2) {
116
+ const [first, second] = resolvedGoal.args;
117
+ if (first.type === 'compound') {
118
+ const firstNode = createProofNode(first, state.substitution, state.depth + 1);
119
+ state.proofNode.children.push(firstNode);
120
+ const firstResult = resolve({
121
+ goals: [first, ...remainingGoals],
122
+ substitution: state.substitution,
123
+ depth: state.depth + 1,
124
+ proofNode: firstNode,
125
+ cut: false,
126
+ }, ctx);
127
+ if (firstResult.cut) {
128
+ return firstResult;
129
+ }
130
+ }
131
+ if (second.type === 'compound') {
132
+ const secondNode = createProofNode(second, state.substitution, state.depth + 1);
133
+ state.proofNode.children.push(secondNode);
134
+ return resolve({
135
+ goals: [second, ...remainingGoals],
136
+ substitution: state.substitution,
137
+ depth: state.depth + 1,
138
+ proofNode: secondNode,
139
+ cut: false,
140
+ }, ctx);
141
+ }
142
+ return { success: false };
143
+ }
144
+ if (resolvedGoal.functor === '->' && resolvedGoal.args.length === 2) {
145
+ const [condition, thenBranch] = resolvedGoal.args;
146
+ if (condition.type === 'compound' && thenBranch.type === 'compound') {
147
+ const condNode = createProofNode(condition, state.substitution, state.depth + 1);
148
+ state.proofNode.children.push(condNode);
149
+ const savedSolutions = ctx.solutions.length;
150
+ const condResult = resolve({
151
+ goals: [condition],
152
+ substitution: state.substitution,
153
+ depth: state.depth + 1,
154
+ proofNode: condNode,
155
+ cut: false,
156
+ }, ctx);
157
+ if (condResult.success && ctx.solutions.length > savedSolutions) {
158
+ const condSolution = ctx.solutions[savedSolutions];
159
+ ctx.solutions.length = savedSolutions;
160
+ const merged = new Map(state.substitution);
161
+ for (const [k, v] of condSolution) {
162
+ merged.set(k, v);
163
+ }
164
+ return resolve({
165
+ goals: [thenBranch, ...remainingGoals],
166
+ substitution: merged,
167
+ depth: state.depth + 1,
168
+ proofNode: condNode,
169
+ cut: false,
170
+ }, ctx);
171
+ }
172
+ ctx.solutions.length = savedSolutions;
173
+ return { success: false };
174
+ }
175
+ }
176
+ if (isBuiltin(resolvedGoal.functor, resolvedGoal.args.length)) {
177
+ const childNode = createProofNode(resolvedGoal, state.substitution, state.depth + 1);
178
+ state.proofNode.children.push(childNode);
179
+ const builtinResult = executeBuiltin(resolvedGoal, state.substitution);
180
+ if (builtinResult.cut) {
181
+ childNode.status = 'cut';
182
+ if (builtinResult.substitutions.length > 0) {
183
+ const result = resolve({
184
+ goals: remainingGoals,
185
+ substitution: builtinResult.substitutions[0],
186
+ depth: state.depth + 1,
187
+ proofNode: childNode,
188
+ cut: false,
189
+ }, ctx);
190
+ return { success: result.success, cut: true };
191
+ }
192
+ return { success: false, cut: true };
193
+ }
194
+ if (!builtinResult.success) {
195
+ childNode.status = 'failure';
196
+ return { success: false };
197
+ }
198
+ let anySuccess = false;
199
+ for (const newSubst of builtinResult.substitutions) {
200
+ if (ctx.solutions.length >= ctx.config.maxSolutions) {
201
+ break;
202
+ }
203
+ const branchNode = createProofNode(resolvedGoal, newSubst, state.depth + 1);
204
+ childNode.children.push(branchNode);
205
+ const result = resolve({
206
+ goals: remainingGoals,
207
+ substitution: newSubst,
208
+ depth: state.depth + 1,
209
+ proofNode: branchNode,
210
+ cut: false,
211
+ }, ctx);
212
+ if (result.success) {
213
+ anySuccess = true;
214
+ branchNode.status = 'success';
215
+ }
216
+ if (result.cut) {
217
+ childNode.status = anySuccess ? 'success' : 'failure';
218
+ return { success: anySuccess, cut: true };
219
+ }
220
+ }
221
+ childNode.status = anySuccess ? 'success' : 'failure';
222
+ return { success: anySuccess };
223
+ }
224
+ const clauses = ctx.kb.getClauses(resolvedGoal.functor, resolvedGoal.args.length);
225
+ if (clauses.length === 0) {
226
+ state.proofNode.status = 'failure';
227
+ return { success: false };
228
+ }
229
+ let anySuccess = false;
230
+ for (const clause of clauses) {
231
+ if (ctx.solutions.length >= ctx.config.maxSolutions) {
232
+ break;
233
+ }
234
+ ctx.clauseCounter++;
235
+ const renamedClause = renameClause(clause, `_${ctx.clauseCounter}`);
236
+ const unifyResult = unify(resolvedGoal, renamedClause.head, state.substitution);
237
+ if (unifyResult === null) {
238
+ continue;
239
+ }
240
+ const childNode = createProofNode(resolvedGoal, unifyResult, state.depth + 1);
241
+ childNode.clause = renamedClause;
242
+ state.proofNode.children.push(childNode);
243
+ const newGoals = [...renamedClause.body, ...remainingGoals];
244
+ const result = resolve({
245
+ goals: newGoals,
246
+ substitution: unifyResult,
247
+ depth: state.depth + 1,
248
+ proofNode: childNode,
249
+ cut: false,
250
+ }, ctx);
251
+ if (result.success) {
252
+ anySuccess = true;
253
+ childNode.status = 'success';
254
+ }
255
+ else {
256
+ childNode.status = 'failure';
257
+ }
258
+ if (result.cut && ctx.config.enableCut) {
259
+ break;
260
+ }
261
+ }
262
+ state.proofNode.status = anySuccess ? 'success' : 'failure';
263
+ return { success: anySuccess };
264
+ }
265
+ function renameClause(clause, suffix) {
266
+ return {
267
+ head: renameVariables(clause.head, suffix),
268
+ body: clause.body.map((g) => renameVariables(g, suffix)),
269
+ metadata: clause.metadata,
270
+ };
271
+ }
272
+ export class SLDResolver {
273
+ kb;
274
+ config;
275
+ constructor(kb, config = {}) {
276
+ this.kb = kb;
277
+ this.config = { ...getDefaultConfig(), ...config };
278
+ }
279
+ query(goals) {
280
+ const startTime = Date.now();
281
+ const queryVars = new Set();
282
+ for (const goal of goals) {
283
+ for (const v of getVariables(goal)) {
284
+ queryVars.add(v);
285
+ }
286
+ }
287
+ const rootNode = createProofNode({ type: 'compound', functor: '?-', args: goals }, new Map(), 0);
288
+ const ctx = {
289
+ kb: this.kb,
290
+ config: this.config,
291
+ startTime,
292
+ exploredNodes: 0,
293
+ maxDepth: 0,
294
+ solutions: [],
295
+ queryVariables: queryVars,
296
+ clauseCounter: 0,
297
+ };
298
+ const state = {
299
+ goals,
300
+ substitution: new Map(),
301
+ depth: 0,
302
+ proofNode: rootNode,
303
+ cut: false,
304
+ };
305
+ resolve(state, ctx);
306
+ const duration = Date.now() - startTime;
307
+ const proofTree = {
308
+ root: rootNode,
309
+ solutions: ctx.solutions,
310
+ exploredNodes: ctx.exploredNodes,
311
+ maxDepth: ctx.maxDepth,
312
+ duration,
313
+ };
314
+ return {
315
+ success: ctx.solutions.length > 0,
316
+ solutions: ctx.solutions,
317
+ proofTree: this.config.traceExecution ? proofTree : undefined,
318
+ confidence: 1.0,
319
+ };
320
+ }
321
+ prove(goal) {
322
+ const result = this.query([goal]);
323
+ return result.success;
324
+ }
325
+ findAll(goal, template) {
326
+ const result = this.query([goal]);
327
+ return result.solutions.map((subst) => applySubstitution(template, subst));
328
+ }
329
+ updateConfig(config) {
330
+ this.config = { ...this.config, ...config };
331
+ }
332
+ getKnowledgeBase() {
333
+ return this.kb;
334
+ }
335
+ }
336
+ export function createResolver(kb, config) {
337
+ return new SLDResolver(kb, config);
338
+ }
339
+ export function queryKnowledgeBase(kb, queryString, config) {
340
+ const { parseQuery: parseQueryFn } = importParser();
341
+ const result = parseQueryFn(queryString);
342
+ if (!result.success || !result.value) {
343
+ return {
344
+ success: false,
345
+ solutions: [],
346
+ explanation: result.error?.message || 'Parse error',
347
+ confidence: 0,
348
+ };
349
+ }
350
+ const resolver = new SLDResolver(kb, config);
351
+ return resolver.query(result.value);
352
+ }
353
+ export function formatSolutions(result) {
354
+ if (!result.success) {
355
+ return 'false.';
356
+ }
357
+ if (result.solutions.length === 0) {
358
+ return 'true.';
359
+ }
360
+ const lines = [];
361
+ for (const solution of result.solutions) {
362
+ if (solution.size === 0) {
363
+ lines.push('true');
364
+ }
365
+ else {
366
+ const bindings = [];
367
+ for (const [varName, term] of solution) {
368
+ if (!varName.startsWith('_')) {
369
+ bindings.push(`${varName} = ${termToString(term)}`);
370
+ }
371
+ }
372
+ if (bindings.length > 0) {
373
+ lines.push(bindings.join(', '));
374
+ }
375
+ else {
376
+ lines.push('true');
377
+ }
378
+ }
379
+ }
380
+ return lines.join(' ;\n') + '.';
381
+ }
382
+ //# sourceMappingURL=resolver.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"resolver.js","sourceRoot":"","sources":["../../src/logic/resolver.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,17 @@
1
+ import type { Term, AtomTerm, VariableTerm, NumberTerm, StringTerm, CompoundTerm, ListTerm, Substitution } from '@cogitator-ai/types';
2
+ export declare function isAtom(term: Term): term is AtomTerm;
3
+ export declare function isVariable(term: Term): term is VariableTerm;
4
+ export declare function isNumber(term: Term): term is NumberTerm;
5
+ export declare function isString(term: Term): term is StringTerm;
6
+ export declare function isCompound(term: Term): term is CompoundTerm;
7
+ export declare function isList(term: Term): term is ListTerm;
8
+ export declare function termsEqual(t1: Term, t2: Term): boolean;
9
+ export declare function occursIn(variable: VariableTerm, term: Term): boolean;
10
+ export declare function applySubstitution(term: Term, subst: Substitution): Term;
11
+ export declare function composeSubstitutions(s1: Substitution, s2: Substitution): Substitution;
12
+ export declare function unify(term1: Term, term2: Term, subst?: Substitution): Substitution | null;
13
+ export declare function getVariables(term: Term): Set<string>;
14
+ export declare function renameVariables(term: Term, suffix: string): Term;
15
+ export declare function substitutionToString(subst: Substitution): string;
16
+ export declare function termToString(term: Term): string;
17
+ //# sourceMappingURL=unification.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"unification.d.ts","sourceRoot":"","sources":["../../src/logic/unification.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EACV,IAAI,EACJ,QAAQ,EACR,YAAY,EACZ,UAAU,EACV,UAAU,EACV,YAAY,EACZ,QAAQ,EACR,YAAY,EACb,MAAM,qBAAqB,CAAC;AAE7B,wBAAgB,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,QAAQ,CAEnD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,YAAY,CAE3D;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,UAAU,CAEvD;AAED,wBAAgB,QAAQ,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,UAAU,CAEvD;AAED,wBAAgB,UAAU,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,YAAY,CAE3D;AAED,wBAAgB,MAAM,CAAC,IAAI,EAAE,IAAI,GAAG,IAAI,IAAI,QAAQ,CAEnD;AAED,wBAAgB,UAAU,CAAC,EAAE,EAAE,IAAI,EAAE,EAAE,EAAE,IAAI,GAAG,OAAO,CA0BtD;AAED,wBAAgB,QAAQ,CAAC,QAAQ,EAAE,YAAY,EAAE,IAAI,EAAE,IAAI,GAAG,OAAO,CAYpE;AAED,wBAAgB,iBAAiB,CAAC,IAAI,EAAE,IAAI,EAAE,KAAK,EAAE,YAAY,GAAG,IAAI,CA0BvE;AAED,wBAAgB,oBAAoB,CAAC,EAAE,EAAE,YAAY,EAAE,EAAE,EAAE,YAAY,GAAG,YAAY,CAcrF;AA0BD,wBAAgB,KAAK,CACnB,KAAK,EAAE,IAAI,EACX,KAAK,EAAE,IAAI,EACX,KAAK,GAAE,YAAwB,GAC9B,YAAY,GAAG,IAAI,CA2ErB;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,GAAG,CAAC,MAAM,CAAC,CAgBpD;AAED,wBAAgB,eAAe,CAAC,IAAI,EAAE,IAAI,EAAE,MAAM,EAAE,MAAM,GAAG,IAAI,CAsBhE;AAED,wBAAgB,oBAAoB,CAAC,KAAK,EAAE,YAAY,GAAG,MAAM,CAMhE;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,IAAI,GAAG,MAAM,CA0B/C"}
@@ -0,0 +1,257 @@
1
+ export function isAtom(term) {
2
+ return term.type === 'atom';
3
+ }
4
+ export function isVariable(term) {
5
+ return term.type === 'variable';
6
+ }
7
+ export function isNumber(term) {
8
+ return term.type === 'number';
9
+ }
10
+ export function isString(term) {
11
+ return term.type === 'string';
12
+ }
13
+ export function isCompound(term) {
14
+ return term.type === 'compound';
15
+ }
16
+ export function isList(term) {
17
+ return term.type === 'list';
18
+ }
19
+ export function termsEqual(t1, t2) {
20
+ if (t1.type !== t2.type)
21
+ return false;
22
+ switch (t1.type) {
23
+ case 'atom':
24
+ return t2.value === t1.value;
25
+ case 'variable':
26
+ return t2.name === t1.name;
27
+ case 'number':
28
+ return t2.value === t1.value;
29
+ case 'string':
30
+ return t2.value === t1.value;
31
+ case 'compound': {
32
+ const c2 = t2;
33
+ if (t1.functor !== c2.functor)
34
+ return false;
35
+ if (t1.args.length !== c2.args.length)
36
+ return false;
37
+ return t1.args.every((arg, i) => termsEqual(arg, c2.args[i]));
38
+ }
39
+ case 'list': {
40
+ const l2 = t2;
41
+ if (t1.elements.length !== l2.elements.length)
42
+ return false;
43
+ if (!t1.elements.every((el, i) => termsEqual(el, l2.elements[i])))
44
+ return false;
45
+ if (t1.tail && l2.tail)
46
+ return termsEqual(t1.tail, l2.tail);
47
+ return !t1.tail && !l2.tail;
48
+ }
49
+ }
50
+ }
51
+ export function occursIn(variable, term) {
52
+ if (isVariable(term)) {
53
+ return term.name === variable.name;
54
+ }
55
+ if (isCompound(term)) {
56
+ return term.args.some((arg) => occursIn(variable, arg));
57
+ }
58
+ if (isList(term)) {
59
+ if (term.elements.some((el) => occursIn(variable, el)))
60
+ return true;
61
+ if (term.tail)
62
+ return occursIn(variable, term.tail);
63
+ }
64
+ return false;
65
+ }
66
+ export function applySubstitution(term, subst) {
67
+ if (isVariable(term)) {
68
+ const bound = subst.get(term.name);
69
+ if (bound) {
70
+ return applySubstitution(bound, subst);
71
+ }
72
+ return term;
73
+ }
74
+ if (isCompound(term)) {
75
+ return {
76
+ type: 'compound',
77
+ functor: term.functor,
78
+ args: term.args.map((arg) => applySubstitution(arg, subst)),
79
+ };
80
+ }
81
+ if (isList(term)) {
82
+ return {
83
+ type: 'list',
84
+ elements: term.elements.map((el) => applySubstitution(el, subst)),
85
+ tail: term.tail ? applySubstitution(term.tail, subst) : undefined,
86
+ };
87
+ }
88
+ return term;
89
+ }
90
+ export function composeSubstitutions(s1, s2) {
91
+ const result = new Map();
92
+ for (const [varName, term] of s1) {
93
+ result.set(varName, applySubstitution(term, s2));
94
+ }
95
+ for (const [varName, term] of s2) {
96
+ if (!result.has(varName)) {
97
+ result.set(varName, term);
98
+ }
99
+ }
100
+ return result;
101
+ }
102
+ function unifyVariable(variable, term, subst) {
103
+ const varName = variable.name;
104
+ if (subst.has(varName)) {
105
+ return unify(subst.get(varName), term, subst);
106
+ }
107
+ if (isVariable(term) && subst.has(term.name)) {
108
+ return unify(variable, subst.get(term.name), subst);
109
+ }
110
+ if (occursIn(variable, term)) {
111
+ return null;
112
+ }
113
+ const newSubst = new Map(subst);
114
+ newSubst.set(varName, term);
115
+ return newSubst;
116
+ }
117
+ export function unify(term1, term2, subst = new Map()) {
118
+ const t1 = applySubstitution(term1, subst);
119
+ const t2 = applySubstitution(term2, subst);
120
+ if (termsEqual(t1, t2)) {
121
+ return subst;
122
+ }
123
+ if (isVariable(t1)) {
124
+ return unifyVariable(t1, t2, subst);
125
+ }
126
+ if (isVariable(t2)) {
127
+ return unifyVariable(t2, t1, subst);
128
+ }
129
+ if (isCompound(t1) && isCompound(t2)) {
130
+ if (t1.functor !== t2.functor)
131
+ return null;
132
+ if (t1.args.length !== t2.args.length)
133
+ return null;
134
+ let currentSubst = subst;
135
+ for (let i = 0; i < t1.args.length; i++) {
136
+ const result = unify(t1.args[i], t2.args[i], currentSubst);
137
+ if (result === null)
138
+ return null;
139
+ currentSubst = result;
140
+ }
141
+ return currentSubst;
142
+ }
143
+ if (isList(t1) && isList(t2)) {
144
+ if (t1.elements.length === 0 && t2.elements.length === 0) {
145
+ if (t1.tail && t2.tail) {
146
+ return unify(t1.tail, t2.tail, subst);
147
+ }
148
+ if (!t1.tail && !t2.tail) {
149
+ return subst;
150
+ }
151
+ if (t1.tail && !t2.tail) {
152
+ return unify(t1.tail, { type: 'list', elements: [] }, subst);
153
+ }
154
+ if (!t1.tail && t2.tail) {
155
+ return unify({ type: 'list', elements: [] }, t2.tail, subst);
156
+ }
157
+ }
158
+ if (t1.elements.length > 0 && t2.elements.length > 0) {
159
+ const headResult = unify(t1.elements[0], t2.elements[0], subst);
160
+ if (headResult === null)
161
+ return null;
162
+ const tail1 = {
163
+ type: 'list',
164
+ elements: t1.elements.slice(1),
165
+ tail: t1.tail,
166
+ };
167
+ const tail2 = {
168
+ type: 'list',
169
+ elements: t2.elements.slice(1),
170
+ tail: t2.tail,
171
+ };
172
+ return unify(tail1, tail2, headResult);
173
+ }
174
+ if (t1.elements.length === 0 && t2.elements.length > 0 && t1.tail) {
175
+ return unify(t1.tail, t2, subst);
176
+ }
177
+ if (t2.elements.length === 0 && t1.elements.length > 0 && t2.tail) {
178
+ return unify(t1, t2.tail, subst);
179
+ }
180
+ return null;
181
+ }
182
+ return null;
183
+ }
184
+ export function getVariables(term) {
185
+ const vars = new Set();
186
+ function collect(t) {
187
+ if (isVariable(t)) {
188
+ vars.add(t.name);
189
+ }
190
+ else if (isCompound(t)) {
191
+ t.args.forEach(collect);
192
+ }
193
+ else if (isList(t)) {
194
+ t.elements.forEach(collect);
195
+ if (t.tail)
196
+ collect(t.tail);
197
+ }
198
+ }
199
+ collect(term);
200
+ return vars;
201
+ }
202
+ export function renameVariables(term, suffix) {
203
+ if (isVariable(term)) {
204
+ return { type: 'variable', name: `${term.name}_${suffix}` };
205
+ }
206
+ if (isCompound(term)) {
207
+ return {
208
+ type: 'compound',
209
+ functor: term.functor,
210
+ args: term.args.map((arg) => renameVariables(arg, suffix)),
211
+ };
212
+ }
213
+ if (isList(term)) {
214
+ return {
215
+ type: 'list',
216
+ elements: term.elements.map((el) => renameVariables(el, suffix)),
217
+ tail: term.tail ? renameVariables(term.tail, suffix) : undefined,
218
+ };
219
+ }
220
+ return term;
221
+ }
222
+ export function substitutionToString(subst) {
223
+ if (subst.size === 0)
224
+ return '{}';
225
+ const entries = Array.from(subst.entries())
226
+ .map(([name, term]) => `${name} = ${termToString(term)}`)
227
+ .join(', ');
228
+ return `{${entries}}`;
229
+ }
230
+ export function termToString(term) {
231
+ switch (term.type) {
232
+ case 'atom':
233
+ return term.value;
234
+ case 'variable':
235
+ return term.name;
236
+ case 'number':
237
+ return term.value.toString();
238
+ case 'string':
239
+ return `"${term.value}"`;
240
+ case 'compound':
241
+ if (term.args.length === 0) {
242
+ return term.functor;
243
+ }
244
+ return `${term.functor}(${term.args.map(termToString).join(', ')})`;
245
+ case 'list': {
246
+ if (term.elements.length === 0 && !term.tail) {
247
+ return '[]';
248
+ }
249
+ const elements = term.elements.map(termToString).join(', ');
250
+ if (term.tail) {
251
+ return `[${elements}|${termToString(term.tail)}]`;
252
+ }
253
+ return `[${elements}]`;
254
+ }
255
+ }
256
+ }
257
+ //# sourceMappingURL=unification.js.map