File size: 2,562 Bytes
d15fde8
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
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
85
86
87
88
89
90
91
92
93
extends Node

func _ready() -> void:
	print("=== Horn Clause Engine Tests ===")
	test_horn_engine()
	
	print("\n=== Intent Engine Tests ===")
	test_intent_engine()
	
	print("\n=== Combined NLP + Horn Query ===")
	test_combined()

func test_horn_engine() -> void:
	var engine := HornEngine.new()
	
	engine.add_fact("item", ["item_1"])
	engine.add_fact("color", ["item_1", "red"])
	engine.add_fact("stored_item", ["item_1", "storage_a"])
	engine.add_fact("location", ["storage_a", "warehouse"])
	
	engine.add_rule(
		{"pred": "in_warehouse", "args": ["?X"]},
		[
			{"pred": "stored_item", "args": ["?X", "?S"]},
			{"pred": "location", "args": ["?S", "warehouse"]}
		]
	)
	
	var results := engine.query({"pred": "in_warehouse", "args": ["?X"]})
	
	for answer in results:
		print("Proof substitution: ", answer)
		print("Resolved item: ", engine.walk("?X", answer))
	
	var multi_results := engine.solve([
		{"pred": "color", "args": ["?X", "red"]},
		{"pred": "in_warehouse", "args": ["?X"]}
	])
	
	print("Multi-goal results count: ", multi_results.size())
	for answer in multi_results:
		print("Red in warehouse: ", engine.walk("?X", answer))

func test_intent_engine() -> void:
	var engine := IntentEngine.new()
	var action_handlers := ActionHandlers.new()
	var intent_registry := IntentRegistry.new()
	
	add_child(engine)
	add_child(action_handlers)
	add_child(intent_registry)
	
	engine.configure(action_handlers)
	intent_registry.install(engine)
	
	test_utterance(engine, "Show me the inventory")
	test_utterance(engine, "Go left")
	test_utterance(engine, "Do something unknown")
	test_utterance(engine, "Cancel")

func test_utterance(engine: IntentEngine, text: String) -> void:
	var intent := engine.resolve(text)
	print("Resolution: ", intent)
	
	if intent["status"] == "matched":
		var result: Variant = engine.dispatch(intent)
		print("Execution result: ", result)

func test_combined() -> void:
	var engine := HornEngine.new()
	engine.add_fact("item", ["item_1"])
	engine.add_fact("color", ["item_1", "red"])
	engine.add_fact("stored_item", ["item_1", "storage_a"])
	engine.add_fact("location", ["storage_a", "warehouse"])
	
	engine.add_rule(
		{"pred": "in_warehouse", "args": ["?X"]},
		[
			{"pred": "stored_item", "args": ["?X", "?S"]},
			{"pred": "location", "args": ["?S", "warehouse"]}
		]
	)
	
	var goals := [
		{"pred": "color", "args": ["?X", "red"]},
		{"pred": "in_warehouse", "args": ["?X"]}
	]
	
	var results := engine.solve(goals)
	print("Combined query results:")
	for answer in results:
		print("  Found: ", engine.walk("?X", answer))