eyeprolog 1.0.3 → 1.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 (159) hide show
  1. package/README.md +10 -9
  2. package/conformance-report.md +3 -2
  3. package/examples/age.pl +2 -0
  4. package/examples/aliases-and-namespaces.pl +2 -0
  5. package/examples/allen-interval-calculus.pl +2 -0
  6. package/examples/binomial-vandermonde.pl +2 -0
  7. package/examples/blocks-world-planning.pl +2 -0
  8. package/examples/book/chapter-02/02-measurement.pl +3 -0
  9. package/examples/book/chapter-03/01-eligible.pl +3 -0
  10. package/examples/book/chapter-03/02-adult.pl +3 -0
  11. package/examples/book/chapter-04/02-path.pl +3 -0
  12. package/examples/book/chapter-06/01-next.pl +3 -0
  13. package/examples/book/chapter-06/03-square.pl +3 -0
  14. package/examples/book/chapter-08/01-findall.pl +3 -0
  15. package/examples/book/chapter-08/02-outgoing_costs.pl +3 -0
  16. package/examples/book/chapter-08/03-best_route.pl +3 -0
  17. package/examples/book/chapter-09/02-normalized.pl +3 -0
  18. package/examples/book/chapter-09/03-message.pl +3 -0
  19. package/examples/book/chapter-10/02-plan.pl +3 -0
  20. package/examples/book/chapter-11/01-why.pl +3 -0
  21. package/examples/book/chapter-17/01-path.pl +3 -0
  22. package/examples/book/chapter-17/02-adult.pl +3 -0
  23. package/examples/book/chapter-17/03-bad_member.pl +3 -0
  24. package/examples/book/chapter-18/01-routeable.pl +3 -0
  25. package/examples/book/chapter-18/02-routeable-2.pl +3 -0
  26. package/examples/book/chapter-21/03-loop_edge.pl +3 -0
  27. package/examples/book/chapter-21/04-eligible.pl +3 -0
  28. package/examples/book/chapter-22/02-tree_member.pl +3 -0
  29. package/examples/book/chapter-22/06-lookup.pl +3 -0
  30. package/examples/book/chapter-23/01-adult.pl +3 -0
  31. package/examples/book/chapter-23/02-adult-2.pl +3 -0
  32. package/examples/book/chapter-23/03-can_board.pl +3 -0
  33. package/examples/book/chapter-23/04-traveler_in_good_standing.pl +3 -0
  34. package/examples/book/chapter-24/02-simple_path.pl +3 -0
  35. package/examples/book/chapter-24/03-reachable.pl +3 -0
  36. package/examples/book/chapter-24/04-best_plan.pl +3 -0
  37. package/examples/book/chapter-25/01-person.pl +3 -0
  38. package/examples/book/chapter-25/02-active_badge.pl +3 -0
  39. package/examples/book/chapter-25/04-permit.pl +3 -0
  40. package/examples/book/chapter-26/02-triple.pl +3 -0
  41. package/examples/book/chapter-26/03-triple-2.pl +3 -0
  42. package/examples/book/chapter-26/04-edge.pl +3 -0
  43. package/examples/book/chapter-27/02-list_length.pl +3 -0
  44. package/examples/book/chapter-28/02-triangle.pl +3 -0
  45. package/examples/book/chapter-28/03-rectangle.pl +3 -0
  46. package/examples/book/chapter-28/04-integer_rectangle.pl +3 -0
  47. package/examples/book/chapter-28/05-preserves_combine.pl +3 -0
  48. package/examples/book/chapter-29/01-counterexample_to_odd_square.pl +3 -0
  49. package/examples/book/chapter-31/01-edge.pl +3 -0
  50. package/examples/book/chapter-31/03-double.pl +3 -0
  51. package/examples/book/chapter-32/01-eligible.pl +3 -0
  52. package/examples/book/chapter-32/02-eligible-2.pl +3 -0
  53. package/examples/book/chapter-32/03-candidate_debug.pl +3 -0
  54. package/examples/book/chapter-32/04-reference_square.pl +3 -0
  55. package/examples/book/chapter-33/01-assigned_badge.pl +3 -0
  56. package/examples/book/chapter-33/02-source_role.pl +3 -0
  57. package/examples/book/chapter-33/03-chosen_pair.pl +3 -0
  58. package/examples/book/chapter-33/04-path.pl +3 -0
  59. package/examples/book/chapter-33/09-invalid_badge_assignment.pl +3 -0
  60. package/examples/book/chapter-34/03-regional_total.pl +3 -0
  61. package/examples/book/chapter-38/01-city.pl +3 -0
  62. package/examples/book/chapter-39/01-answer.pl +3 -0
  63. package/examples/book/chapter-39/02-answer-2.pl +3 -0
  64. package/examples/book/chapter-39/03-answer-3.pl +3 -0
  65. package/examples/book/chapter-39/04-cost.pl +3 -0
  66. package/examples/book/chapter-39/05-message.pl +3 -0
  67. package/examples/catalan-convolution.pl +2 -0
  68. package/examples/cdcl-sat-solver.pl +2 -0
  69. package/examples/chart-parser.pl +2 -0
  70. package/examples/collatz-1000.pl +2 -0
  71. package/examples/combinatorics-findall-sort.pl +2 -0
  72. package/examples/context-schema-audit.pl +2 -0
  73. package/examples/continued-fraction-sqrt2.pl +2 -0
  74. package/examples/critical-path-schedule.pl +2 -0
  75. package/examples/d3-group.pl +2 -0
  76. package/examples/data-negotiation.pl +2 -0
  77. package/examples/delfour.pl +3 -0
  78. package/examples/dijkstra-findall-sort.pl +2 -0
  79. package/examples/dijkstra.pl +2 -0
  80. package/examples/dog.pl +2 -0
  81. package/examples/donald-gerald-robert.pl +2 -0
  82. package/examples/drone-corridor-planner.pl +2 -0
  83. package/examples/easter-computus.pl +2 -0
  84. package/examples/enigma1225.pl +3 -0
  85. package/examples/equality-saturation.pl +3 -0
  86. package/examples/eulerian-path.pl +2 -0
  87. package/examples/flandor.pl +2 -0
  88. package/examples/four-color-map.pl +2 -0
  89. package/examples/fundamental-theorem-arithmetic.pl +4 -1
  90. package/examples/goldbach.pl +2 -0
  91. package/examples/gps.pl +2 -0
  92. package/examples/graph-reachability.pl +2 -0
  93. package/examples/hamiltonian-path.pl +2 -0
  94. package/examples/hanoi.pl +2 -0
  95. package/examples/integer-partitions.pl +2 -0
  96. package/examples/job-shop-scheduling.pl +3 -0
  97. package/examples/knapsack-optimization.pl +3 -0
  98. package/examples/knuth-bendix-completion.pl +2 -0
  99. package/examples/lee.pl +2 -0
  100. package/examples/linear-logic-resources.pl +2 -0
  101. package/examples/list-collection.pl +2 -0
  102. package/examples/map-four-color-search.pl +2 -0
  103. package/examples/markov-logic-network.pl +2 -0
  104. package/examples/matrix-chain-order.pl +3 -0
  105. package/examples/missionaries-cannibals.pl +3 -0
  106. package/examples/monkey-bananas.pl +2 -0
  107. package/examples/n-queens.pl +2 -0
  108. package/examples/observability-log-correlation.pl +2 -0
  109. package/examples/path-discovery.pl +3 -0
  110. package/examples/pell-equation.pl +2 -0
  111. package/examples/polynomial.pl +3 -0
  112. package/examples/prime-range.pl +3 -0
  113. package/examples/proof/iso-dynamic-database.pl +1 -1
  114. package/examples/quine-mccluskey.pl +2 -0
  115. package/examples/register-allocation.pl +3 -0
  116. package/examples/reusable-builtins.pl +3 -0
  117. package/examples/sat-solver-dpll.pl +3 -0
  118. package/examples/send-more-money.pl +2 -0
  119. package/examples/stable-marriage.pl +2 -0
  120. package/examples/statistics-summary.pl +2 -0
  121. package/examples/stirling-bell-numbers.pl +2 -0
  122. package/examples/sudoku.pl +3 -0
  123. package/examples/term-tools.pl +2 -0
  124. package/examples/totient-summatory.pl +3 -0
  125. package/examples/truth-maintenance-system.pl +2 -0
  126. package/examples/turing.pl +2 -0
  127. package/examples/uuid.pl +3 -0
  128. package/examples/weighted-interval-scheduling.pl +3 -0
  129. package/examples/wolf-goat-cabbage.pl +2 -0
  130. package/examples/zebra.pl +2 -0
  131. package/index.d.ts +7 -3
  132. package/package.json +1 -1
  133. package/src/cli.js +1 -1
  134. package/src/explain.js +5 -5
  135. package/src/index.js +3 -3
  136. package/src/iso.js +14 -9
  137. package/src/{eyeprolog-library.pl → lib/eyeprolog.pl} +37 -2
  138. package/src/lib/lists.pl +94 -0
  139. package/src/parser.js +12 -4
  140. package/src/program.js +222 -40
  141. package/src/solver.js +39 -7
  142. package/src/standard-library.js +60 -0
  143. package/src/term.js +18 -6
  144. package/test/conformance/cases/modules/qualified_call.pl +6 -0
  145. package/test/conformance/cases/modules/selective_library_import.pl +5 -0
  146. package/test/conformance/expected/modules/qualified_call.pl +1 -0
  147. package/test/conformance/expected/modules/selective_library_import.pl +1 -0
  148. package/test/run-conformance.mjs +10 -4
  149. package/test/run-playground.mjs +7 -7
  150. package/test/run-regression.mjs +56 -25
  151. package/the-art-of-eyeprolog.md +265 -55
  152. package/tools/extract-book-examples.mjs +1 -1
  153. package/why-eyeprolog.md +5 -4
  154. package/src/eyeprolog-autoload.js +0 -127
  155. package/src/eyeprolog-common-library.pl +0 -44
  156. package/test/conformance/errors/syntax/colon_name_rejected.pl +0 -1
  157. package/test/conformance/errors/syntax/unquoted_colon_predicate.pl +0 -1
  158. package/test/conformance/expected-errors/syntax/colon_name_rejected.txt +0 -1
  159. package/test/conformance/expected-errors/syntax/unquoted_colon_predicate.txt +0 -1
package/README.md CHANGED
@@ -5,10 +5,11 @@
5
5
 
6
6
  EyeProlog turns portable ISO Prolog programs into answers and inspectable proofs.
7
7
 
8
- <p align="center">
8
+ <p>
9
9
  <a href="https://eyereasoner.github.io/eyeprolog/the-art-of-eyeprolog">
10
- <img src="book-assets/title-page.svg" alt="Read The Art of EyeProlog" width="240">
11
- </a>
10
+ <img src="book-assets/title-page.svg" alt="Read The Art of EyeProlog" title="Click to read The Art of EyeProlog" width="320">
11
+ </a><br>
12
+ <strong>Click the cover to read <em>The Art of EyeProlog</em>.</strong>
12
13
  </p>
13
14
 
14
15
  **[Why EyeProlog?](https://eyereasoner.github.io/eyeprolog/why-eyeprolog)** — Discover its purpose and design.
@@ -32,14 +33,14 @@ Programs may declare their default queries with `%% goal:` comments.
32
33
  Double-quoted text follows the ISO `double_quotes` flag and defaults to a
33
34
  proper list of one-character atoms (`chars`), matching Trealla and Scryer.
34
35
 
35
- ## Portable library
36
+ ## Standard library modules
36
37
 
37
38
  EyeProlog adds 44 public library predicates to its 127-entry ISO core registry.
38
- **All 44 are ordinary Prolog clauses** across `src/eyeprolog-library.pl` and
39
- `src/eyeprolog-common-library.pl`; both are autoloaded in Node and the
40
- browser. None requires host support. Other Prolog systems should load only
41
- `eyeprolog-library.pl`, which avoids redefining their common list predicates.
42
- Portable text predicates use ISO atoms or character lists.
39
+ **All 44 are ordinary Prolog clauses** in `src/lib/eyeprolog.pl` and
40
+ `src/lib/lists.pl`. They are ISO/IEC 13211-2 modules, loaded explicitly with
41
+ `use_module(library(eyeprolog))` or `use_module(library(lists))`, following the
42
+ layout used by Scryer Prolog. None requires host support. Portable text
43
+ predicates use ISO atoms or character lists.
43
44
 
44
45
  ## Development
45
46
 
@@ -13,13 +13,14 @@ This report summarizes the file-based conformance corpus under `test/conformance
13
13
  | control | 15 | 0 | 0 | 0 | 15 |
14
14
  | iso | 130 | 174 | 0 | 0 | 304 |
15
15
  | lists | 52 | 3 | 0 | 0 | 55 |
16
+ | modules | 2 | 0 | 0 | 0 | 2 |
16
17
  | negation | 8 | 0 | 19 | 0 | 27 |
17
18
  | proofs | 0 | 0 | 0 | 21 | 21 |
18
19
  | query | 8 | 2 | 0 | 0 | 10 |
19
20
  | rules | 13 | 3 | 0 | 0 | 16 |
20
21
  | strings | 40 | 0 | 0 | 0 | 40 |
21
- | syntax | 12 | 25 | 0 | 0 | 37 |
22
+ | syntax | 12 | 23 | 0 | 0 | 35 |
22
23
  | terms | 26 | 3 | 0 | 0 | 29 |
23
24
  | unification | 18 | 0 | 0 | 0 | 18 |
24
25
  | variables | 16 | 9 | 0 | 0 | 25 |
25
- | **Total** | **443** | **227** | **19** | **21** | **710** |
26
+ | **Total** | **445** | **225** | **19** | **21** | **710** |
package/examples/age.pl CHANGED
@@ -1,3 +1,5 @@
1
+ :- use_module(library(eyeprolog)).
2
+
1
3
  % Age checker adapted from Eyeling.
2
4
  % The example combines date literals, ISO-8601 duration values, an explicit
3
5
  % local_time/1 fact, difference/3, and duration comparison. Declaring the date
@@ -1,3 +1,5 @@
1
+ :- use_module(library(eyeprolog)).
2
+
1
3
  % Built-ins use one native spelling each, while vocabulary-style predicate names
2
4
  % remain ordinary user predicates.
3
5
  %
@@ -1,3 +1,5 @@
1
+ :- use_module(library(lists)).
2
+
1
3
  % Allen interval calculus adapted from Eyeling allen-interval-calculus.n3.
2
4
  % Eyeling demonstrates dateTime and duration built-ins; this eyeprolog version
3
5
  % uses integer hour offsets so the interval rules remain pure Horn clauses.
@@ -1,3 +1,5 @@
1
+ :- use_module(library(eyeprolog)).
2
+
1
3
  % Binomial coefficients and Vandermonde's identity.
2
4
  %
3
5
  % choose(N,K,C) is computed by a multiplicative recurrence, then vandermonde/5 checks
@@ -1,3 +1,5 @@
1
+ :- use_module(library(lists)).
2
+
1
3
  % Blocks-world planning without cut.
2
4
  %
3
5
  % A finite-depth planner searches for a five-move plan over five blocks. States
@@ -1,3 +1,6 @@
1
1
  % From The Art of EyeProlog, Chapter 2.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  measurement(battery_1, sample(17, volts(28.4), amps(12.1))).
3
6
  route(a, d, path([a, b, d], cost(9))).
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 3.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  eligible(Person) :-
3
6
  age(Person, Years),
4
7
  (Years >= 18),
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 3.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  adult(Person) :-
3
6
  age(Person, Years),
4
7
  (Years >= 18).
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 4 — Constructing the recursive argument.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  path(X, Y, [X, Y]) :- edge(X, Y).
3
6
  path(X, Z, [X | Rest]) :-
4
7
  edge(X, Y),
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 6.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  next(X, Y) :- (Y is X + 1).
3
6
  area_rectangle(W, H, Area) :- (Area is W * H).
4
7
 
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 6.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  square(N, Square) :-
3
6
  between(1, 10, N),
4
7
  (Square is N * N).
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 8.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  findall(Template, Goal, List).
3
6
  countall(Goal, Count).
4
7
  sumall(Value, Goal, Sum).
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 8.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  outgoing_costs(Node, Costs) :-
3
6
  findall(Cost, edge(Node, _, Cost), Costs).
4
7
 
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 8.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  best_route(From, To, Route, Cost) :-
3
6
  aggregate_min(
4
7
  [CandidateCost, CandidateRoute],
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 9.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  normalized(Input, Words) :-
3
6
  trim(Input, Trimmed),
4
7
  lowercase(Trimmed, Lower),
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 9.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  message(event_17, (severity(high), source(sensor_3), reading(temp, 91))).
3
6
 
4
7
  context_member((Left, _right), Member) :- context_member(Left, Member).
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 10.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  plan(State, State, _, []).
3
6
  plan(State, Goal, Seen, [Move | Moves]) :-
4
7
  transition(State, Move, Next),
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 11.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  why(
3
6
  type(socrates, mortal),
4
7
  proof(
@@ -1,3 +1,6 @@
1
1
  % From The Art of EyeProlog, Chapter 17.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  path(X, Y) :- edge(X, Y).
3
6
  path(X, Z) :- edge(X, Y), path(Y, Z).
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 17 — The same relation, a different computation.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  adult(Person) :- person(Person), age(Person, Age), (Age >= 18).
3
6
 
4
7
  adult(Person) :- (Age >= 18), age(Person, Age), person(Person).
@@ -1,3 +1,6 @@
1
1
  % From The Art of EyeProlog, Chapter 17.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  % Poor control: recursion starts before one list cell is exposed.
3
6
  bad_member(X, List) :- bad_member(X, Rest), (List = [_ | Rest]).
@@ -1,2 +1,5 @@
1
1
  % From The Art of EyeProlog, Chapter 18 — Begin with ground sentences.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  routeable(parcel_7, hub_north).
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 18.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  routeable(Parcel, Hub) :-
3
6
  destination_zone(Parcel, Zone),
4
7
  serves(Hub, Zone),
@@ -1,2 +1,5 @@
1
1
  % From The Art of EyeProlog, Chapter 21.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  loop_edge(Node) :- edge(Node, Node).
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 21 — Failure rewinds choices, not facts.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  eligible(Person) :-
3
6
  applicant(Person),
4
7
  age(Person, Age),
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 22.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  tree_member(X, tree(X, _, _)).
3
6
  tree_member(X, tree(_, Left, _)) :- tree_member(X, Left).
4
7
  tree_member(X, tree(_, _, Right)) :- tree_member(X, Right).
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 22.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  lookup(Name, [binding(Name, Value) | _], Value).
3
6
  lookup(Name, [_ | Rest], Value) :- lookup(Name, Rest, Value).
4
7
 
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 23 — Unfolding and folding.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  adult(Person) :-
3
6
  recorded_age(Person, Age),
4
7
  adult_age(Age).
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 23.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  adult(Person) :-
3
6
  recorded_age(Person, Age),
4
7
  (Age >= 18).
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 23.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  can_board(Person) :-
3
6
  registered(Person),
4
7
  identity_checked(Person),
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 23.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  traveler_in_good_standing(Person) :-
3
6
  registered(Person),
4
7
  identity_checked(Person),
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 24 — Search over states.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  simple_path(From, To, Path) :-
3
6
  walk(From, To, [From], Reversed),
4
7
  reverse(Reversed, Path).
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 24 — Existence, one witness, and all witnesses.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  reachable(From, To).
3
6
  once(simple_path(From, To, Path)).
4
7
  findall(Path, simple_path(From, To, Path), Paths).
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 24 — Optimization is search plus an order.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  best_plan(Request, Plan, Cost) :-
3
6
  aggregate_min(
4
7
  [CandidateCost, CandidatePlan],
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 25 — Source and concept layers.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  person(ada).
3
6
  badge(b17, ada).
4
7
  badge_status(b17, active).
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 25.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  active_badge(Person, Badge) :-
3
6
  badge(Badge, Person),
4
7
  badge_status(Badge, active).
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 25 — Decision, reasons, and proof.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  permit(Person, Zone) :-
3
6
  active_badge(Person, Badge),
4
7
  cleared_for(Badge, Zone),
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 26 — Answers are existential witnesses.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  triple(A, B, C) :-
3
6
  between(1, 20, A),
4
7
  between(A, 20, B),
@@ -1,2 +1,5 @@
1
1
  % From The Art of EyeProlog, Chapter 26 — Proof objects and proof checking.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  triple(3, 4, 5).
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 26 — The least model as mathematical closure.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  edge(a, b).
3
6
  edge(b, c).
4
7
 
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 27 — Structural induction and data design.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  list_length([], 0).
3
6
  list_length([_ | Tail], N) :-
4
7
  list_length(Tail, M),
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 28 — Symmetry reduces search.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  triangle(A, B, C) :-
3
6
  between(1, 20, A),
4
7
  between(A, 20, B),
@@ -1,2 +1,5 @@
1
1
  % From The Art of EyeProlog, Chapter 28 — Relations reveal inverse problems.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  rectangle(W, H, Area) :- (Area is W * H).
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 28.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  integer_rectangle(Area, W, H) :-
3
6
  between(1, Area, W),
4
7
  between(W, Area, H),
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 28 — Composition, homomorphism, and reusable laws.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  preserves_combine(X, Y) :-
3
6
  combine(X, Y, XY),
4
7
  image(X, IX),
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 29 — Examples suggest; proofs compel.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  counterexample_to_odd_square(N) :-
3
6
  between(1, 100, N),
4
7
  (1 is N mod 2),
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 31 — Positive and negative observers.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  edge(a, b).
3
6
  edge(b, c).
4
7
 
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 31 — Properties over finite domains.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  double(N, D) :- (D is N + N).
3
6
 
4
7
  double_is_even(N) :-
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 32 — Follow bindings from left to right.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  eligible(Person) :-
3
6
  (Age >= 18),
4
7
  age(Person, Age).
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 32.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  eligible(Person) :-
3
6
  age(Person, Age),
4
7
  (Age >= 18).
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 32 — Create diagnostic relations.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  candidate_debug(Person, Age) :-
3
6
  age(Person, Age).
4
7
 
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 32 — Compare specification and implementation.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  reference_square(N, S) :-
3
6
  between(0, 20, N),
4
7
  (S is N * N).
@@ -1,2 +1,5 @@
1
1
  % From The Art of EyeProlog, Chapter 33 — Pattern 1: Ground sentence first.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  assigned_badge(alex, badge_17).
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 33 — Pattern 2: Normalize at the boundary.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  source_role(person_7, 'Doctor').
3
6
 
4
7
  canonical_role(Person, clinician) :-
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 33 — Pattern 3: Generate, constrain, describe.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  chosen_pair(pair(X, Y), reason(sum_is_ten)) :-
3
6
  between(0, 10, X),
4
7
  between(X, 10, Y),
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 33 — Pattern 4: Carry the witness.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  path(X, Y, [X, Y]) :- edge(X, Y).
3
6
  path(X, Z, [X | Rest]) :-
4
7
  edge(X, Y),
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 33 — Pattern 9: Integrity before inference.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  invalid_badge_assignment(Badge, PersonA, PersonB) :-
3
6
  assigned_badge(PersonA, Badge),
4
7
  assigned_badge(PersonB, Badge),
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 34.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  regional_total(Region, Total) :-
3
6
  bagof(Amount, Seller^sale(Region, Seller, Amount), Amounts),
4
7
  sum_amounts(Amounts, Total).
@@ -1,3 +1,6 @@
1
1
  % From The Art of EyeProlog, Chapter 38.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  city('München').
3
6
  message("café").
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 39 — The EyeProlog library.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  answer(square, S) :- (S is 12 * 12).
3
6
  answer(day_count, N) :- between(3, 5, N).
4
7
  answer(age, D) :- difference('2026-07-28', '2020-05-20', D).
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 39.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  answer(split, pair(Prefix, Suffix)) :-
3
6
  append(Prefix, Suffix, [a, b]).
4
7
 
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 39.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  answer(words, Words) :-
3
6
  trim(' Logic Made Visible ', Clean),
4
7
  lowercase(Clean, Lower),
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 39.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  cost(a, 8).
3
6
  cost(b, 3).
4
7
  cost(c, 3).
@@ -1,4 +1,7 @@
1
1
  % From The Art of EyeProlog, Chapter 39.
2
+ :- use_module(library(eyeprolog)).
3
+ :- use_module(library(lists)).
4
+
2
5
  message(event_17,
3
6
  (severity(high), source(sensor_3), reading(temp, 91))).
4
7
 
@@ -1,3 +1,5 @@
1
+ :- use_module(library(eyeprolog)).
2
+
1
3
  % Catalan numbers by automatically tabled convolution.
2
4
  %
3
5
  % catalan(N,C) sums all splits of N-1 into left and right substructures. The same
@@ -1,3 +1,5 @@
1
+ :- use_module(library(lists)).
2
+
1
3
  % A tiny CDCL-style SAT trace with one learned clause.
2
4
  %
3
5
  % Industrial CDCL solvers use watched literals, mutable trails, non-chronological
@@ -1,3 +1,5 @@
1
+ :- use_module(library(lists)).
2
+
1
3
  % A tiny automatically tabled chart parser for a context-free grammar.
2
4
  %
3
5
  % span(Sentence, Category, Start, End) is the dynamic-programming chart item: