-
Notifications
You must be signed in to change notification settings - Fork 1
Expand file tree
/
Copy pathdebug.js
More file actions
84 lines (65 loc) · 2.27 KB
/
debug.js
File metadata and controls
84 lines (65 loc) · 2.27 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
import { PrologScript } from "./src/core/PrologScript.js";
// Initialize the PrologScript class
const ps = new PrologScript();
console.log("PrologScript initialized!");
ps.createReality("Debug");
ps.switchReality("Debug");
// Define semantic relationships
ps.addSemanticRelation('mortality', 'mortal');
ps.addSemanticRelation('alive', 'living');
ps.addSemanticRelation('living', 'life');
// Define facts
ps.isA('socrates', 'human');
ps.hasA('human', 'mortality', true);
// Define rules
ps.addRule('mortal:$X',
'isA:$X:human',
'hasA:human:mortality:true'
);
// Now this should work
console.log(ps.infer('mortal', 'socrates')); // true
// And you can do more complex semantic relationships
ps.hasA('plant', 'alive', true);
ps.addRule('living:$X',
'hasA:$X:life:true'
);
console.log(ps.infer('living', 'plant')); // true
// Define family relationships
ps.isA('alice', 'person');
ps.isA('bob', 'person');
ps.isA('carol', 'person');
ps.hasA('alice', 'parent', 'bob');
ps.hasA('bob', 'parent', 'carol');
ps.addRule(
'ancestor:$X:$Y', // X is ancestor of Y
'hasA:$Y:parent:$X' // Y has parent X (means X is parent of Y)
);
ps.addRule(
'ancestor:$X:$Z', // X is ancestor of Z
'hasA:$Z:parent:$Y', // Z has parent Y
'ancestor:$X:$Y' // and X is ancestor of Y
);
// Queries
console.log(ps.query('ancestor', 'carol', 'alice'));
console.log(ps.query('ancestor', '$X', 'alice'));
// Define causal relationships
ps.causes('rain', 'wetGrass', (rainState) => rainState ? 'wet' : 'dry');
ps.causes('sprinkler', 'wetGrass', (sprinklerState) => sprinklerState ? 'wet' : 'dry');
// Define possible states
ps.stateSpace('rain', [true, false]);
ps.stateSpace('sprinkler', [true, false]);
ps.stateSpace('wetGrass', ['wet', 'dry']);
// Assert actual world
ps.assert('rain', false);
ps.assert('sprinkler', false);
ps.assert('wetGrass', 'dry');
// Create counterfactual
const cf = ps.createCounterfactual('whatIfRain')
.intervene('rain', true)
.compute();
console.log(cf.getEffect('wetGrass')); // 'wet'
// Temporal reasoning
ps.addTimeStep(1, new Map([['rain', false], ['wetGrass', 'dry']]));
ps.addTimeStep(2, new Map([['rain', true], ['wetGrass', 'wet']]));
console.log(ps.query('atTime', 2, 'wetGrass', 'wet')); // true
console.log('Finish');