deepclause-sdk 0.0.89 → 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.
- package/README.md +417 -948
- package/dist/agent.d.ts +18 -2
- package/dist/agent.d.ts.map +1 -1
- package/dist/agent.js +74 -21
- package/dist/agent.js.map +1 -1
- package/dist/cli/config.d.ts +323 -176
- package/dist/cli/config.d.ts.map +1 -1
- package/dist/cli/config.js +146 -188
- package/dist/cli/config.js.map +1 -1
- package/dist/cli/index.d.ts +3 -2
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +61 -425
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/login.d.ts +29 -0
- package/dist/cli/login.d.ts.map +1 -0
- package/dist/cli/login.js +184 -0
- package/dist/cli/login.js.map +1 -0
- package/dist/cli/readline.d.ts +6 -0
- package/dist/cli/readline.d.ts.map +1 -0
- package/dist/cli/readline.js +15 -0
- package/dist/cli/readline.js.map +1 -0
- package/dist/cli/repl-bin.d.ts +9 -0
- package/dist/cli/repl-bin.d.ts.map +1 -0
- package/dist/cli/repl-bin.js +16 -0
- package/dist/cli/repl-bin.js.map +1 -0
- package/dist/cli/repl.d.ts +191 -0
- package/dist/cli/repl.d.ts.map +1 -0
- package/dist/cli/repl.js +1232 -0
- package/dist/cli/repl.js.map +1 -0
- package/dist/cli/run.d.ts +17 -18
- package/dist/cli/run.d.ts.map +1 -1
- package/dist/cli/run.js +196 -183
- package/dist/cli/run.js.map +1 -1
- package/dist/cli/set-backend.d.ts +53 -0
- package/dist/cli/set-backend.d.ts.map +1 -0
- package/dist/cli/set-backend.js +259 -0
- package/dist/cli/set-backend.js.map +1 -0
- package/dist/cli/visualize.d.ts +38 -0
- package/dist/cli/visualize.d.ts.map +1 -0
- package/dist/cli/visualize.js +125 -0
- package/dist/cli/visualize.js.map +1 -0
- package/dist/compiler.d.ts +5 -52
- package/dist/compiler.d.ts.map +1 -1
- package/dist/compiler.js +4 -768
- package/dist/compiler.js.map +1 -1
- package/dist/index.d.ts +27 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +18 -2
- package/dist/index.js.map +1 -1
- package/dist/prolog/bridge.d.ts +3 -1
- package/dist/prolog/bridge.d.ts.map +1 -1
- package/dist/prolog/bridge.js +8 -1
- package/dist/prolog/bridge.js.map +1 -1
- package/dist/prolog-src/deepclause_analysis.pl +10 -2
- package/dist/prolog-src/deepclause_mi.pl +2245 -41
- package/dist/repl/agent.d.ts +72 -0
- package/dist/repl/agent.d.ts.map +1 -0
- package/dist/repl/agent.js +366 -0
- package/dist/repl/agent.js.map +1 -0
- package/dist/repl/auth.d.ts +45 -0
- package/dist/repl/auth.d.ts.map +1 -0
- package/dist/repl/auth.js +116 -0
- package/dist/repl/auth.js.map +1 -0
- package/dist/repl/backend.d.ts +290 -0
- package/dist/repl/backend.d.ts.map +1 -0
- package/dist/repl/backend.js +370 -0
- package/dist/repl/backend.js.map +1 -0
- package/dist/repl/compaction.d.ts +122 -0
- package/dist/repl/compaction.d.ts.map +1 -0
- package/dist/repl/compaction.js +318 -0
- package/dist/repl/compaction.js.map +1 -0
- package/dist/repl/export.d.ts +30 -0
- package/dist/repl/export.d.ts.map +1 -0
- package/dist/repl/export.js +23 -0
- package/dist/repl/export.js.map +1 -0
- package/dist/repl/frames.d.ts +21 -0
- package/dist/repl/frames.d.ts.map +1 -0
- package/dist/repl/frames.js +79 -0
- package/dist/repl/frames.js.map +1 -0
- package/dist/repl/harness-tools.d.ts +74 -0
- package/dist/repl/harness-tools.d.ts.map +1 -0
- package/dist/repl/harness-tools.js +121 -0
- package/dist/repl/harness-tools.js.map +1 -0
- package/dist/repl/highlight.d.ts +30 -0
- package/dist/repl/highlight.d.ts.map +1 -0
- package/dist/repl/highlight.js +285 -0
- package/dist/repl/highlight.js.map +1 -0
- package/dist/repl/history.d.ts +234 -0
- package/dist/repl/history.d.ts.map +1 -0
- package/dist/repl/history.js +661 -0
- package/dist/repl/history.js.map +1 -0
- package/dist/repl/index.d.ts +120 -0
- package/dist/repl/index.d.ts.map +1 -0
- package/dist/repl/index.js +107 -0
- package/dist/repl/index.js.map +1 -0
- package/dist/repl/judge.d.ts +51 -0
- package/dist/repl/judge.d.ts.map +1 -0
- package/dist/repl/judge.js +58 -0
- package/dist/repl/judge.js.map +1 -0
- package/dist/repl/markdown.d.ts +25 -0
- package/dist/repl/markdown.d.ts.map +1 -0
- package/dist/repl/markdown.js +103 -0
- package/dist/repl/markdown.js.map +1 -0
- package/dist/repl/picker.d.ts +34 -0
- package/dist/repl/picker.d.ts.map +1 -0
- package/dist/repl/picker.js +81 -0
- package/dist/repl/picker.js.map +1 -0
- package/dist/repl/project-context.d.ts +16 -0
- package/dist/repl/project-context.d.ts.map +1 -0
- package/dist/repl/project-context.js +23 -0
- package/dist/repl/project-context.js.map +1 -0
- package/dist/repl/render.d.ts +160 -0
- package/dist/repl/render.d.ts.map +1 -0
- package/dist/repl/render.js +715 -0
- package/dist/repl/render.js.map +1 -0
- package/dist/repl/session.d.ts +356 -0
- package/dist/repl/session.d.ts.map +1 -0
- package/dist/repl/session.js +1275 -0
- package/dist/repl/session.js.map +1 -0
- package/dist/repl/status.d.ts +100 -0
- package/dist/repl/status.d.ts.map +1 -0
- package/dist/repl/status.js +218 -0
- package/dist/repl/status.js.map +1 -0
- package/dist/repl/tools.d.ts +53 -0
- package/dist/repl/tools.d.ts.map +1 -0
- package/dist/repl/tools.js +307 -0
- package/dist/repl/tools.js.map +1 -0
- package/dist/repl/toolset.d.ts +32 -0
- package/dist/repl/toolset.d.ts.map +1 -0
- package/dist/repl/toolset.js +82 -0
- package/dist/repl/toolset.js.map +1 -0
- package/dist/repl/tui/editor.d.ts +17 -0
- package/dist/repl/tui/editor.d.ts.map +1 -0
- package/dist/repl/tui/editor.js +39 -0
- package/dist/repl/tui/editor.js.map +1 -0
- package/dist/repl/tui/status-bar.d.ts +26 -0
- package/dist/repl/tui/status-bar.d.ts.map +1 -0
- package/dist/repl/tui/status-bar.js +47 -0
- package/dist/repl/tui/status-bar.js.map +1 -0
- package/dist/repl/tui/theme.d.ts +30 -0
- package/dist/repl/tui/theme.d.ts.map +1 -0
- package/dist/repl/tui/theme.js +81 -0
- package/dist/repl/tui/theme.js.map +1 -0
- package/dist/repl/tui/transcript.d.ts +39 -0
- package/dist/repl/tui/transcript.d.ts.map +1 -0
- package/dist/repl/tui/transcript.js +123 -0
- package/dist/repl/tui/transcript.js.map +1 -0
- package/dist/runner.d.ts +132 -13
- package/dist/runner.d.ts.map +1 -1
- package/dist/runner.js +434 -277
- package/dist/runner.js.map +1 -1
- package/dist/sdk.d.ts.map +1 -1
- package/dist/sdk.js +0 -32
- package/dist/sdk.js.map +1 -1
- package/dist/system/assets/docs/AGENT_PROMPT.md +1373 -0
- package/dist/system/assets/docs/DML_AUTHORING.md +195 -0
- package/dist/system/assets/docs/DML_REFERENCE.md +312 -72
- package/dist/system/assets/docs/HARNESS_EXAMPLES.md +172 -0
- package/dist/system/assets/docs/HARNESS_PATTERNS.md +562 -0
- package/dist/system/assets/docs/META_PROMPT.md +68 -0
- package/dist/system/assets/docs/PROLOG_SNIPPETS.md +117 -0
- package/dist/system/assets/index.d.ts +9 -17
- package/dist/system/assets/index.d.ts.map +1 -1
- package/dist/system/assets/index.js +26 -85
- package/dist/system/assets/index.js.map +1 -1
- package/dist/system/runtime/agentvm-manager.d.ts +9 -2
- package/dist/system/runtime/agentvm-manager.d.ts.map +1 -1
- package/dist/system/runtime/agentvm-manager.js +70 -44
- package/dist/system/runtime/agentvm-manager.js.map +1 -1
- package/dist/system/runtime/media.d.ts +23 -0
- package/dist/system/runtime/media.d.ts.map +1 -0
- package/dist/system/runtime/media.js +55 -0
- package/dist/system/runtime/media.js.map +1 -0
- package/dist/system/runtime/shell-limits.d.ts +21 -0
- package/dist/system/runtime/shell-limits.d.ts.map +1 -0
- package/dist/system/runtime/shell-limits.js +39 -0
- package/dist/system/runtime/shell-limits.js.map +1 -0
- package/dist/system/runtime/shell-manager.d.ts +8 -3
- package/dist/system/runtime/shell-manager.d.ts.map +1 -1
- package/dist/system/runtime/shell-manager.js +56 -39
- package/dist/system/runtime/shell-manager.js.map +1 -1
- package/dist/system/runtime/shell-tool-events.js +5 -0
- package/dist/system/runtime/shell-tool-events.js.map +1 -1
- package/dist/system/runtime/token-usage.d.ts +2 -0
- package/dist/system/runtime/token-usage.d.ts.map +1 -1
- package/dist/system/runtime/token-usage.js +7 -0
- package/dist/system/runtime/token-usage.js.map +1 -1
- package/dist/tools.d.ts +3 -21
- package/dist/tools.d.ts.map +1 -1
- package/dist/tools.js +14 -168
- package/dist/tools.js.map +1 -1
- package/dist/types.d.ts +80 -118
- package/dist/types.d.ts.map +1 -1
- package/dist/validate.d.ts +19 -0
- package/dist/validate.d.ts.map +1 -0
- package/dist/validate.js +338 -0
- package/dist/validate.js.map +1 -0
- package/dist/visualize/index.d.ts +52 -0
- package/dist/visualize/index.d.ts.map +1 -0
- package/dist/visualize/index.js +189 -0
- package/dist/visualize/index.js.map +1 -0
- package/package.json +17 -15
- package/src/prolog-src/deepclause_analysis.pl +10 -2
- package/src/prolog-src/deepclause_mi.pl +2245 -41
- package/dist/cli/commands.d.ts +0 -42
- package/dist/cli/commands.d.ts.map +0 -1
- package/dist/cli/commands.js +0 -246
- package/dist/cli/commands.js.map +0 -1
- package/dist/cli/compile.d.ts +0 -99
- package/dist/cli/compile.d.ts.map +0 -1
- package/dist/cli/compile.js +0 -363
- package/dist/cli/compile.js.map +0 -1
- package/dist/cli/default-skills.d.ts +0 -10
- package/dist/cli/default-skills.d.ts.map +0 -1
- package/dist/cli/default-skills.js +0 -206
- package/dist/cli/default-skills.js.map +0 -1
- package/dist/cli/interactive.d.ts +0 -2
- package/dist/cli/interactive.d.ts.map +0 -1
- package/dist/cli/interactive.js +0 -20
- package/dist/cli/interactive.js.map +0 -1
- package/dist/cli/mcp.d.ts +0 -56
- package/dist/cli/mcp.d.ts.map +0 -1
- package/dist/cli/mcp.js +0 -138
- package/dist/cli/mcp.js.map +0 -1
- package/dist/cli/prompt.d.ts +0 -2
- package/dist/cli/prompt.d.ts.map +0 -1
- package/dist/cli/prompt.js +0 -2
- package/dist/cli/prompt.js.map +0 -1
- package/dist/cli/search.d.ts +0 -19
- package/dist/cli/search.d.ts.map +0 -1
- package/dist/cli/search.js +0 -189
- package/dist/cli/search.js.map +0 -1
- package/dist/cli/tool-args.d.ts +0 -2
- package/dist/cli/tool-args.d.ts.map +0 -1
- package/dist/cli/tool-args.js +0 -39
- package/dist/cli/tool-args.js.map +0 -1
- package/dist/cli/tools.d.ts +0 -36
- package/dist/cli/tools.d.ts.map +0 -1
- package/dist/cli/tools.js +0 -229
- package/dist/cli/tools.js.map +0 -1
- package/dist/cli/tui/index.d.ts +0 -22
- package/dist/cli/tui/index.d.ts.map +0 -1
- package/dist/cli/tui/index.js +0 -29
- package/dist/cli/tui/index.js.map +0 -1
- package/dist/cli/tui.d.ts +0 -167
- package/dist/cli/tui.d.ts.map +0 -1
- package/dist/cli/tui.js +0 -5228
- package/dist/cli/tui.js.map +0 -1
- package/dist/compiler_prompt.d.ts +0 -20
- package/dist/compiler_prompt.d.ts.map +0 -1
- package/dist/compiler_prompt.js +0 -870
- package/dist/compiler_prompt.js.map +0 -1
- package/dist/deepclause-cli.skill +0 -0
- package/dist/prolog-src/deepclause_mi.pl.bak +0 -570
- package/dist/system/assets/docs/CONDUCTOR_PROMPT.md +0 -105
- package/dist/system/assets/docs/DML_COMPILER_PROMPT.md +0 -700
- package/dist/system/assets/docs/TUI.md +0 -150
- package/dist/system/assets/recipes/deepclause-coding-workflow/SKILL.md +0 -100
- package/dist/system/assets/skills/conductor.dml +0 -76
- package/dist/system/assets/skills/deep-planner.dml +0 -412
- package/dist/system/assets/skills/plan.dml +0 -429
- package/dist/system/assets/skills/security-planner.dml +0 -337
- package/dist/system/assets/skills/skill-creator.dml +0 -187
- package/dist/system/runtime/catalog-recipes.d.ts +0 -24
- package/dist/system/runtime/catalog-recipes.d.ts.map +0 -1
- package/dist/system/runtime/catalog-recipes.js +0 -273
- package/dist/system/runtime/catalog-recipes.js.map +0 -1
- package/dist/system/runtime/catalog-skills.d.ts +0 -50
- package/dist/system/runtime/catalog-skills.d.ts.map +0 -1
- package/dist/system/runtime/catalog-skills.js +0 -152
- package/dist/system/runtime/catalog-skills.js.map +0 -1
- package/dist/system/runtime/conductor.d.ts +0 -105
- package/dist/system/runtime/conductor.d.ts.map +0 -1
- package/dist/system/runtime/conductor.js +0 -732
- package/dist/system/runtime/conductor.js.map +0 -1
- package/dist/system/runtime/console-capture.d.ts +0 -9
- package/dist/system/runtime/console-capture.d.ts.map +0 -1
- package/dist/system/runtime/console-capture.js +0 -67
- package/dist/system/runtime/console-capture.js.map +0 -1
- package/dist/system/runtime/dml-executor.d.ts +0 -52
- package/dist/system/runtime/dml-executor.d.ts.map +0 -1
- package/dist/system/runtime/dml-executor.js +0 -203
- package/dist/system/runtime/dml-executor.js.map +0 -1
- package/dist/system/runtime/runtime-tools.d.ts +0 -31
- package/dist/system/runtime/runtime-tools.d.ts.map +0 -1
- package/dist/system/runtime/runtime-tools.js +0 -312
- package/dist/system/runtime/runtime-tools.js.map +0 -1
- package/dist/system/runtime/skill-creator.d.ts +0 -38
- package/dist/system/runtime/skill-creator.d.ts.map +0 -1
- package/dist/system/runtime/skill-creator.js +0 -763
- package/dist/system/runtime/skill-creator.js.map +0 -1
- package/src/prolog-src/deepclause_mi.pl.bak +0 -570
|
@@ -0,0 +1,172 @@
|
|
|
1
|
+
# Idiomatic harness examples
|
|
2
|
+
|
|
3
|
+
Copy-paste shapes for REPL harnesses. Keep each skill small and compose them.
|
|
4
|
+
(The snippets are tested against the bundled SWI-Prolog.)
|
|
5
|
+
|
|
6
|
+
Most skills should look like §2–§3: a short sequence of `task/N`/`prompt/N` calls
|
|
7
|
+
with thin guards between them. §4–§7 (facts, pure logic, judgments, CLP) are the
|
|
8
|
+
exception — reach for them only when the task is genuinely data- or
|
|
9
|
+
logic-shaped, not as the default style. DML is the orchestration layer over model
|
|
10
|
+
calls, not the logic library (`DML_AUTHORING.md` §0). For file work, shell out
|
|
11
|
+
(`exec(bash(...))`) instead of reading files into DML (§2).
|
|
12
|
+
|
|
13
|
+
Every skill carries a `doc(Name/Arity, Text)` annotation and the harness a
|
|
14
|
+
`module_doc(Text)` line (`DML_AUTHORING.md` §4). `module_doc/1` is the harness's
|
|
15
|
+
**skill description** — what it does and when to use it; it is the first line of
|
|
16
|
+
the manifest, which the agent reads at session start and whenever it changes. A
|
|
17
|
+
file with only `module_doc/1` is still a valid skill (an advertised capability
|
|
18
|
+
with an empty body). Keep both terse.
|
|
19
|
+
|
|
20
|
+
```prolog
|
|
21
|
+
module_doc("Example harness: a few small skills used as patterns. Use when you need a copy-paste starting point.").
|
|
22
|
+
```
|
|
23
|
+
|
|
24
|
+
## 1. Wrap a workspace script as a tool
|
|
25
|
+
|
|
26
|
+
Materialize the program as a workspace file (run a DML goal with
|
|
27
|
+
`make_directory_path("scripts"), write_file("scripts/count_words.py", "…")`),
|
|
28
|
+
link it with `script_file/2`, and define a predicate for it. `tool/2` is only an
|
|
29
|
+
annotation that exposes an existing predicate to `task/N`; keep it a one-line
|
|
30
|
+
delegation so the predicate is also callable from `execute` / `/goal`:
|
|
31
|
+
|
|
32
|
+
```prolog
|
|
33
|
+
script_file(count_words, ".dc-repl/scripts/count_words.py").
|
|
34
|
+
|
|
35
|
+
% The capability: callable from `execute` / `/goal` and from `task/N`.
|
|
36
|
+
count_words(File, Count) :-
|
|
37
|
+
script_file(count_words, Script),
|
|
38
|
+
format(atom(Cmd), "python3 '~w' '~w'", [Script, File]),
|
|
39
|
+
exec(bash(command: Cmd), Result),
|
|
40
|
+
get_dict(stdout, Result, Count).
|
|
41
|
+
|
|
42
|
+
% The annotation exposing it to the nested agent (delegation only).
|
|
43
|
+
tool(count_words(File, Count), "Count words in a workspace file.") :-
|
|
44
|
+
count_words(File, Count).
|
|
45
|
+
```
|
|
46
|
+
|
|
47
|
+
Untrusted data goes through files/stdin, never interpolated into the shell
|
|
48
|
+
command. `script_file/2` is just a fact (the exporter bundles the file); the
|
|
49
|
+
write lands on disk immediately, so `bash` can run the script in the same turn.
|
|
50
|
+
|
|
51
|
+
## 2. A skill that calls the model
|
|
52
|
+
|
|
53
|
+
`task/N` runs a bounded agentic turn. Name each output variable in the
|
|
54
|
+
description so the model fills it:
|
|
55
|
+
|
|
56
|
+
```prolog
|
|
57
|
+
doc(classify/2, "Route a support message. classify(+Message, -Team). Example: /goal classify(\"I was charged twice\", T).").
|
|
58
|
+
|
|
59
|
+
classify(Message, Team) :-
|
|
60
|
+
task("Route this support message to exactly one of billing, orders, or account. Message: {Message}. Store the choice in Team.", Team).
|
|
61
|
+
|
|
62
|
+
demo :-
|
|
63
|
+
classify("I was charged twice for the same order", Team),
|
|
64
|
+
format(string(Out), "Routed to ~w", [Team]),
|
|
65
|
+
answer(Out).
|
|
66
|
+
```
|
|
67
|
+
|
|
68
|
+
## 3. Multi-step pipeline: task -> task -> answer
|
|
69
|
+
|
|
70
|
+
```prolog
|
|
71
|
+
report(Topic, Result) :-
|
|
72
|
+
task("List three risks of using an LLM for arithmetic. Store them in Risks.", Risks),
|
|
73
|
+
format(string(Desc), "Rank these risks and explain the top one: ~w", [Risks]),
|
|
74
|
+
task(Desc, Top),
|
|
75
|
+
format(string(Result), "Top risk: ~w", [Top]).
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
Compose the steps and let the model do the thinking; keep only thin guards
|
|
79
|
+
between them — an if-then-else for a branch, `once/1` to commit the first
|
|
80
|
+
answer, or a simple check that fails a step:
|
|
81
|
+
|
|
82
|
+
```prolog
|
|
83
|
+
summarise(Doc, Summary) :-
|
|
84
|
+
task("Extract the document's main claim. Store it in Claim.", Claim),
|
|
85
|
+
( Claim == ""
|
|
86
|
+
-> Summary = "no claim found"
|
|
87
|
+
; task("Summarise this claim in one sentence: {Claim}", Summary)
|
|
88
|
+
).
|
|
89
|
+
```
|
|
90
|
+
|
|
91
|
+
## 4. Data as facts (data = code)
|
|
92
|
+
|
|
93
|
+
Small/medium data belongs in the module and is queried exactly like code:
|
|
94
|
+
|
|
95
|
+
```prolog
|
|
96
|
+
parent(alice, bob).
|
|
97
|
+
parent(alice, carol).
|
|
98
|
+
parent(bob, dave).
|
|
99
|
+
parent(carol, eve).
|
|
100
|
+
|
|
101
|
+
doc(ancestor/2, "Transitive parent. ancestor(+A, -B) enumerates descendants. Example: /goal ancestor(alice, X).").
|
|
102
|
+
|
|
103
|
+
ancestor(A, B) :- parent(A, B).
|
|
104
|
+
ancestor(A, B) :- parent(A, C), ancestor(C, B).
|
|
105
|
+
```
|
|
106
|
+
|
|
107
|
+
```text
|
|
108
|
+
/goal ancestor(alice, X).
|
|
109
|
+
X = bob ; X = carol ; X = dave ; X = eve
|
|
110
|
+
```
|
|
111
|
+
|
|
112
|
+
## 5. Pure logic + a test predicate
|
|
113
|
+
|
|
114
|
+
```prolog
|
|
115
|
+
doc(tally/2, "Count occurrences of each item. tally(+List, -Counts) yields Key-N pairs. Example: /goal tally([a,b,a,c,a], C).").
|
|
116
|
+
|
|
117
|
+
tally(List, Counts) :-
|
|
118
|
+
list_to_set(List, Items),
|
|
119
|
+
findall(Item-N, (member(Item, Items), aggregate_all(count, member(Item, List), N)), Counts).
|
|
120
|
+
|
|
121
|
+
test_tally :-
|
|
122
|
+
tally([a,b,a,c,a], C),
|
|
123
|
+
C == [a-3, b-1, c-1].
|
|
124
|
+
```
|
|
125
|
+
|
|
126
|
+
`/goal test_tally.` succeeds when the behavior is correct. When a skill changes,
|
|
127
|
+
update or add its test and run it (`execute` during a turn, or `/goal`).
|
|
128
|
+
|
|
129
|
+
## 6. Semantic judgments (the model decides, Prolog enforces)
|
|
130
|
+
|
|
131
|
+
```prolog
|
|
132
|
+
route(Message, Team) :-
|
|
133
|
+
choose(Message, "Which team should handle this?", [billing, orders, account], Team).
|
|
134
|
+
|
|
135
|
+
urgent(Message) :-
|
|
136
|
+
holds(Message, "Is this urgent?").
|
|
137
|
+
```
|
|
138
|
+
|
|
139
|
+
`choose/4` always returns one of your options; `verify/3` is three-valued
|
|
140
|
+
(`yes`/`no`/`unknown`); `holds/2` is the semidet wrapper.
|
|
141
|
+
|
|
142
|
+
## 7. Constraints with CLP(FD)
|
|
143
|
+
|
|
144
|
+
```prolog
|
|
145
|
+
:- use_module(library(clpfd)).
|
|
146
|
+
|
|
147
|
+
doc(solve/3, "X+Y=Total with X<Y over 0..100. solve(+Total, -X, -Y). Example: /goal solve(10, X, Y).").
|
|
148
|
+
|
|
149
|
+
solve(Total, X, Y) :-
|
|
150
|
+
[X, Y] ins 0..100,
|
|
151
|
+
X + Y #= Total,
|
|
152
|
+
X #< Y,
|
|
153
|
+
label([X, Y]).
|
|
154
|
+
```
|
|
155
|
+
|
|
156
|
+
The `:- use_module(...)` directive must be **top-level** (an inline
|
|
157
|
+
`use_module` inside a body is not run at read time, so `#=`/`ins` are unknown).
|
|
158
|
+
|
|
159
|
+
## 8. Vision: describe a workspace image
|
|
160
|
+
|
|
161
|
+
```prolog
|
|
162
|
+
doc(describe_image/2, "Describe an image file. describe_image(+Path, -Text). Example: /goal describe_image(\"photos/fox.png\", T).").
|
|
163
|
+
|
|
164
|
+
describe_image(Path, Text) :-
|
|
165
|
+
read_media(Path, Image), % media(Path, Mime) — no bytes
|
|
166
|
+
attach_media(Image), % reference-only; sent by the next task/N
|
|
167
|
+
task("Describe the attached image in one sentence.", Text).
|
|
168
|
+
```
|
|
169
|
+
|
|
170
|
+
Images are files; `media(Path, Mime)` is the reference. The bytes are read from
|
|
171
|
+
the workspace at call time, only PNG/JPEG/GIF/WebP are accepted, and they never
|
|
172
|
+
enter clauses or memory. Judgments stay text-only.
|