eyelang 1.1.17 → 1.1.19
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/docs/guide.md +3 -1
- package/examples/ackermann.pl +6 -5
- package/examples/age.pl +4 -6
- package/examples/aliases-and-namespaces.pl +7 -9
- package/examples/ancestor.pl +5 -4
- package/examples/backward.pl +6 -7
- package/examples/bayes-therapy.pl +7 -0
- package/examples/beam-deflection.pl +3 -5
- package/examples/binomial-vandermonde.pl +4 -0
- package/examples/blocks-world-planning.pl +4 -2
- package/examples/buck-converter-design.pl +5 -0
- package/examples/cache-performance.pl +4 -2
- package/examples/canary-release.pl +4 -2
- package/examples/catalan-convolution.pl +6 -2
- package/examples/chart-parser.pl +8 -2
- package/examples/clinical-trial-screening.pl +5 -0
- package/examples/combinatorics-findall-sort.pl +7 -6
- package/examples/complex.pl +5 -0
- package/examples/continued-fraction-sqrt2.pl +7 -1
- package/examples/control-system.pl +4 -0
- package/examples/critical-path-schedule.pl +7 -2
- package/examples/cyclic-path.pl +8 -6
- package/examples/d3-group.pl +3 -4
- package/examples/dairy-energy-balance.pl +7 -6
- package/examples/data-negotiation.pl +3 -4
- package/examples/deontic-logic.pl +3 -3
- package/examples/dijkstra-findall-sort.pl +3 -4
- package/examples/dijkstra-risk-path.pl +9 -8
- package/examples/dijkstra.pl +11 -7
- package/examples/dining-philosophers.pl +11 -4
- package/examples/dog.pl +7 -7
- package/examples/dpv-odrl-purpose-mapping.pl +3 -1
- package/examples/drone-corridor-planner.pl +5 -8
- package/examples/easter-computus.pl +4 -5
- package/examples/electrical-rc-filter.pl +5 -4
- package/examples/epidemic-policy.pl +3 -4
- package/examples/equivalence-classes-overlap-implies-same-class.pl +8 -8
- package/examples/eulerian-path.pl +8 -6
- package/examples/ev-range-worlds.pl +10 -5
- package/examples/existential-rule.pl +9 -6
- package/examples/exoplanet-validation-worlds.pl +8 -2
- package/examples/expression-eval.pl +8 -6
- package/examples/family-cousins.pl +4 -2
- package/examples/fastpow.pl +14 -6
- package/examples/fft8-numeric.pl +9 -7
- package/examples/fibonacci.pl +12 -5
- package/examples/field-nitrogen-balance.pl +9 -6
- package/examples/floating-point.pl +11 -6
- package/examples/four-color-map.pl +6 -0
- package/examples/fundamental-theorem-arithmetic.pl +6 -0
- package/examples/gd-step-certified.pl +4 -0
- package/examples/gdpr-compliance.pl +4 -4
- package/examples/good-cobbler.pl +4 -2
- package/examples/gps.pl +5 -11
- package/examples/graph-reachability.pl +3 -6
- package/examples/gray-code-counter.pl +4 -5
- package/examples/greatest-lower-bound-uniqueness.pl +9 -7
- package/examples/group-inverse-uniqueness.pl +4 -2
- package/examples/hamiltonian-path.pl +4 -2
- package/examples/hamming-code.pl +4 -0
- package/examples/hanoi.pl +3 -4
- package/examples/heat-loss.pl +10 -5
- package/examples/heron-theorem.pl +11 -5
- package/examples/ideal-gas-law.pl +4 -2
- package/examples/integer-partitions.pl +6 -1
- package/examples/intuitionistic-logic-kripke.pl +69 -0
- package/examples/job-shop-scheduling.pl +6 -2
- package/examples/knapsack-optimization.pl +7 -1
- package/examples/knowledge-engineering-alignment-flow.pl +9 -3
- package/examples/law-of-cosines.pl +12 -6
- package/examples/least-squares-regression.pl +4 -0
- package/examples/linear-logic-resources.pl +51 -0
- package/examples/list-collection.pl +4 -2
- package/examples/lldm.pl +4 -2
- package/examples/matrix-chain-order.pl +8 -1
- package/examples/microgrid-dispatch.pl +4 -0
- package/examples/missionaries-cannibals.pl +7 -1
- package/examples/modal-logic-kripke.pl +45 -0
- package/examples/modular-exponentiation.pl +6 -2
- package/examples/n-queens-8.pl +7 -3
- package/examples/newton-raphson.pl +3 -4
- package/examples/observability-log-correlation.pl +9 -3
- package/examples/odrl-dpv-fpv-trust-flow.pl +9 -1
- package/examples/odrl-dpv-healthcare-risk-ranked.pl +8 -4
- package/examples/orbital-transfer-design.pl +3 -0
- package/examples/output/intuitionistic-logic-kripke.pl +5 -0
- package/examples/output/linear-logic-resources.pl +2 -0
- package/examples/output/modal-logic-kripke.pl +4 -0
- package/examples/peano-arithmetic.pl +4 -2
- package/examples/peasant.pl +4 -5
- package/examples/pell-equation.pl +7 -2
- package/examples/proof/beam-deflection.pl +227 -0
- package/examples/proof/cache-performance.pl +310 -0
- package/examples/proof/canary-release.pl +172 -0
- package/examples/proof/chart-parser.pl +474 -0
- package/examples/proof/clinical-trial-screening.pl +389 -0
- package/examples/proof/composition-of-injective-functions-is-injective.pl +258 -0
- package/examples/proof/diamond-property.pl +307 -0
- package/examples/proof/dpv-odrl-purpose-mapping.pl +348 -0
- package/examples/proof/epidemic-policy.pl +774 -0
- package/examples/proof/equivalence-classes-overlap-implies-same-class.pl +1098 -0
- package/examples/proof/expression-eval.pl +105 -0
- package/examples/proof/gdpr-compliance.pl +199 -0
- package/examples/proof/hanoi.pl +185 -0
- package/examples/proof/heat-loss.pl +228 -0
- package/examples/proof/ideal-gas-law.pl +151 -0
- package/examples/proof/intuitionistic-logic-kripke.pl +133 -0
- package/examples/proof/linear-logic-resources.pl +205 -0
- package/examples/proof/modal-logic-kripke.pl +125 -0
- package/examples/proof/nixon-diamond.pl +181 -0
- package/examples/proof/security-incident-correlation.pl +270 -0
- package/examples/quadratic-formula.pl +4 -2
- package/examples/radioactive-decay.pl +6 -4
- package/examples/reusable-builtins.pl +5 -1
- package/examples/send-more-money.pl +6 -1
- package/examples/stable-marriage.pl +7 -1
- package/examples/statistics-summary.pl +4 -2
- package/examples/stirling-bell-numbers.pl +7 -1
- package/examples/sudoku-4x4.pl +7 -1
- package/examples/term-tools.pl +10 -1
- package/examples/totient-summatory.pl +6 -2
- package/examples/trust-flow-provenance-threshold.pl +8 -1
- package/examples/turing.pl +5 -3
- package/examples/vector-similarity.pl +7 -3
- package/examples/vulnerability-impact.pl +4 -5
- package/examples/weighted-interval-scheduling.pl +6 -1
- package/examples/zebra.pl +5 -4
- package/package.json +1 -1
- package/playground.html +3 -0
- package/test/run-examples.mjs +20 -0
package/docs/guide.md
CHANGED
|
@@ -397,17 +397,20 @@ Each example has a checked golden output in `examples/output`.
|
|
|
397
397
|
| [`ideal-gas-law.pl`](../examples/ideal-gas-law.pl) | Applies the ideal gas law. | [`output/ideal-gas-law.pl`](../examples/output/ideal-gas-law.pl) |
|
|
398
398
|
| [`illegitimate-reasoning.pl`](../examples/illegitimate-reasoning.pl) | Detects suspect reasoning patterns. | [`output/illegitimate-reasoning.pl`](../examples/output/illegitimate-reasoning.pl) |
|
|
399
399
|
| [`integer-partitions.pl`](../examples/integer-partitions.pl) | Counts integer partitions with memoized dynamic programming. | [`output/integer-partitions.pl`](../examples/output/integer-partitions.pl) |
|
|
400
|
+
| [`intuitionistic-logic-kripke.pl`](../examples/intuitionistic-logic-kripke.pl) | Emulates intuitionistic Kripke forcing and constructive implication. | [`output/intuitionistic-logic-kripke.pl`](../examples/output/intuitionistic-logic-kripke.pl) |
|
|
400
401
|
| [`job-shop-scheduling.pl`](../examples/job-shop-scheduling.pl) | Searches a small job-shop schedule and minimizes makespan. | [`output/job-shop-scheduling.pl`](../examples/output/job-shop-scheduling.pl) |
|
|
401
402
|
| [`knapsack-optimization.pl`](../examples/knapsack-optimization.pl) | Optimizes a finite 0/1 knapsack pack with aggregation. | [`output/knapsack-optimization.pl`](../examples/output/knapsack-optimization.pl) |
|
|
402
403
|
| [`knowledge-engineering-alignment-flow.pl`](../examples/knowledge-engineering-alignment-flow.pl) | Specializes reusable alignment rules into a target-shaped flow view. | [`output/knowledge-engineering-alignment-flow.pl`](../examples/output/knowledge-engineering-alignment-flow.pl) |
|
|
403
404
|
| [`law-of-cosines.pl`](../examples/law-of-cosines.pl) | Computes a triangle side by cosine law. | [`output/law-of-cosines.pl`](../examples/output/law-of-cosines.pl) |
|
|
404
405
|
| [`least-squares-regression.pl`](../examples/least-squares-regression.pl) | Fits a least-squares regression line. | [`output/least-squares-regression.pl`](../examples/output/least-squares-regression.pl) |
|
|
406
|
+
| [`linear-logic-resources.pl`](../examples/linear-logic-resources.pl) | Emulates linear logic resource consumption with explicit state threading. | [`output/linear-logic-resources.pl`](../examples/output/linear-logic-resources.pl) |
|
|
405
407
|
| [`list-collection.pl`](../examples/list-collection.pl) | Demonstrates list and collection built-ins. | [`output/list-collection.pl`](../examples/output/list-collection.pl) |
|
|
406
408
|
| [`lldm.pl`](../examples/lldm.pl) | Calculates leg-length discrepancy measurements. | [`output/lldm.pl`](../examples/output/lldm.pl) |
|
|
407
409
|
| [`manufacturing-quality-control.pl`](../examples/manufacturing-quality-control.pl) | Evaluates process capability and quality. | [`output/manufacturing-quality-control.pl`](../examples/output/manufacturing-quality-control.pl) |
|
|
408
410
|
| [`matrix-chain-order.pl`](../examples/matrix-chain-order.pl) | Finds an optimal matrix-chain multiplication order. | [`output/matrix-chain-order.pl`](../examples/output/matrix-chain-order.pl) |
|
|
409
411
|
| [`microgrid-dispatch.pl`](../examples/microgrid-dispatch.pl) | Plans microgrid dispatch and reserve. | [`output/microgrid-dispatch.pl`](../examples/output/microgrid-dispatch.pl) |
|
|
410
412
|
| [`missionaries-cannibals.pl`](../examples/missionaries-cannibals.pl) | Solves the missionaries-and-cannibals river crossing puzzle. | [`output/missionaries-cannibals.pl`](../examples/output/missionaries-cannibals.pl) |
|
|
413
|
+
| [`modal-logic-kripke.pl`](../examples/modal-logic-kripke.pl) | Emulates modal box and diamond operators over a finite Kripke frame. | [`output/modal-logic-kripke.pl`](../examples/output/modal-logic-kripke.pl) |
|
|
411
414
|
| [`modular-exponentiation.pl`](../examples/modular-exponentiation.pl) | Computes modular powers by repeated squaring. | [`output/modular-exponentiation.pl`](../examples/output/modular-exponentiation.pl) |
|
|
412
415
|
| [`monkey-bananas.pl`](../examples/monkey-bananas.pl) | Solves the monkey-and-bananas puzzle. | [`output/monkey-bananas.pl`](../examples/output/monkey-bananas.pl) |
|
|
413
416
|
| [`n-queens-8.pl`](../examples/n-queens-8.pl) | Solves the 8-queens search problem with diagonal constraints. | [`output/n-queens-8.pl`](../examples/output/n-queens-8.pl) |
|
|
@@ -453,7 +456,6 @@ Each example has a checked golden output in `examples/output`.
|
|
|
453
456
|
| [`witch.pl`](../examples/witch.pl) | Derives the classic “burn the witch” rule chain. | [`output/witch.pl`](../examples/output/witch.pl) |
|
|
454
457
|
| [`wolf-goat-cabbage.pl`](../examples/wolf-goat-cabbage.pl) | Solves the wolf-goat-cabbage river crossing. | [`output/wolf-goat-cabbage.pl`](../examples/output/wolf-goat-cabbage.pl) |
|
|
455
458
|
| [`zebra.pl`](../examples/zebra.pl) | Solves the zebra logic puzzle. | [`output/zebra.pl`](../examples/output/zebra.pl) |
|
|
456
|
-
|
|
457
459
|
## Golden outputs, tests, and conformance
|
|
458
460
|
|
|
459
461
|
Golden answer outputs live in [`examples/output`](../examples/output). `npm run test:eyelang` covers the eyelang integration check, conformance cases, regression checks, runnable examples, and proof-output examples. A curated proof-output suite for `.pl` examples lives in [`examples/proof`](../examples/proof). Example tests pin `local_time/1` to `2026-05-30` so date-dependent examples stay deterministic. Regenerate them after an intentional output or explanation change:
|
package/examples/ackermann.pl
CHANGED
|
@@ -1,12 +1,13 @@
|
|
|
1
1
|
% Ackermann-style hyperoperation benchmark adapted from Eyeling ackermann.n3.
|
|
2
|
-
% The
|
|
3
|
-
%
|
|
2
|
+
% The public ackermann/2 answers are small, but the helper relation exercises
|
|
3
|
+
% deeply nested arithmetic recursion: hyper/4 encodes successor, addition,
|
|
4
|
+
% multiplication, exponentiation, and then the Ackermann-style offset
|
|
5
|
+
% ackermann(X, Y) = hyper(X, Y + 3, 2) - 3.
|
|
6
|
+
% Keeping the selected inputs explicit avoids unbounded generation while still
|
|
7
|
+
% testing the solver's recursive numeric workload.
|
|
4
8
|
|
|
5
|
-
% Output declarations: materialize/2 selects the relations written to this example's golden output.
|
|
6
9
|
materialize(ackermann, 2).
|
|
7
10
|
|
|
8
|
-
% Program structure: facts set up the scenario, and rules derive the materialized conclusions.
|
|
9
|
-
% Derivation rules: each rule below contributes one logical step toward the displayed results.
|
|
10
11
|
ackermann(X, Y, A) :-
|
|
11
12
|
add(Y, 3, B),
|
|
12
13
|
hyper(X, B, 2, C),
|
package/examples/age.pl
CHANGED
|
@@ -1,21 +1,19 @@
|
|
|
1
1
|
% Age checker adapted from Eyeling.
|
|
2
|
-
%
|
|
3
|
-
%
|
|
2
|
+
% The example combines date literals, ISO-8601 duration values, local_time/1,
|
|
3
|
+
% difference/3, and duration comparison. It deliberately uses the current
|
|
4
|
+
% local date so the derived ageAbove/2 fact remains an executable temporal
|
|
5
|
+
% check rather than a precomputed constant.
|
|
4
6
|
|
|
5
|
-
% Person data.
|
|
6
|
-
% Output declarations: materialize/2 selects the relations written to this example's golden output.
|
|
7
7
|
materialize(birthDay, 2).
|
|
8
8
|
materialize(duration, 2).
|
|
9
9
|
materialize(ageAbove, 2).
|
|
10
10
|
materialize(is, 2).
|
|
11
11
|
|
|
12
|
-
% Program structure: facts set up the scenario, and rules derive the materialized conclusions.
|
|
13
12
|
birthDay(patH, "1944-08-21").
|
|
14
13
|
duration(check, "P80Y").
|
|
15
14
|
|
|
16
15
|
% A person is above a duration if the local date minus the birthday is greater
|
|
17
16
|
% than that duration.
|
|
18
|
-
% Derivation rules: each rule below contributes one logical step toward the displayed results.
|
|
19
17
|
ageAbove(S, A) :-
|
|
20
18
|
birthDay(S, B),
|
|
21
19
|
duration(check, A),
|
|
@@ -1,17 +1,15 @@
|
|
|
1
|
-
% Built-ins use one native spelling each
|
|
2
|
-
%
|
|
3
|
-
|
|
4
|
-
%
|
|
5
|
-
%
|
|
6
|
-
% Output declarations: materialize/2 selects the relations written to this example's golden output.
|
|
1
|
+
% Built-ins use one native spelling each, while vocabulary-style predicate names
|
|
2
|
+
% remain ordinary user predicates.
|
|
3
|
+
%
|
|
4
|
+
% This keeps the language small: add/3, lt/2, matches/3, and rest/2 are native
|
|
5
|
+
% operations, but labels such as nativeMath or vocabularyExample are just data.
|
|
7
6
|
materialize(value, 2).
|
|
8
7
|
materialize(ok, 2).
|
|
9
8
|
materialize(tail, 2).
|
|
10
9
|
materialize(label, 2).
|
|
11
10
|
|
|
12
|
-
%
|
|
13
|
-
%
|
|
14
|
-
% Derivation rules: each rule below contributes one logical step toward the displayed results.
|
|
11
|
+
% The first four rules call native built-ins; the last two rules show that
|
|
12
|
+
% application vocabulary is modeled with ordinary facts and rules.
|
|
15
13
|
value(nativeMath, X) :- add(0.125, 0.875, X).
|
|
16
14
|
ok(nativeCompare, true) :- lt(2, 3).
|
|
17
15
|
ok(nativeString, true) :- matches("scoped retail insight", "retail|medical").
|
package/examples/ancestor.pl
CHANGED
|
@@ -1,17 +1,18 @@
|
|
|
1
1
|
% Basic recursive relation example.
|
|
2
|
-
%
|
|
3
|
-
%
|
|
2
|
+
% parent/2 facts form a small family chain. ancestor/2 has the classic two-rule
|
|
3
|
+
% shape: one base rule copies direct parents, and one recursive rule walks one
|
|
4
|
+
% parent edge before continuing through the chain. Both source and derived
|
|
5
|
+
% relations are materialized so the output shows the closure explicitly.
|
|
6
|
+
|
|
4
7
|
materialize(parent, 2).
|
|
5
8
|
materialize(ancestor, 2).
|
|
6
9
|
|
|
7
|
-
% Program structure: facts set up the scenario, and rules derive the materialized conclusions.
|
|
8
10
|
% Direct parent facts form a simple chain.
|
|
9
11
|
parent(pat, jan).
|
|
10
12
|
parent(jan, lies).
|
|
11
13
|
parent(lies, emma).
|
|
12
14
|
|
|
13
15
|
% Base case: every parent is also an ancestor.
|
|
14
|
-
% Derivation rules: each rule below contributes one logical step toward the displayed results.
|
|
15
16
|
ancestor(X, Y) :-
|
|
16
17
|
parent(X, Y).
|
|
17
18
|
|
package/examples/backward.pl
CHANGED
|
@@ -1,12 +1,11 @@
|
|
|
1
|
-
%
|
|
2
|
-
|
|
1
|
+
% Backward-rule example adapted from Eyeling backward.n3.
|
|
2
|
+
% Eyeling writes the interestingness rule in a backward style; eyelang records
|
|
3
|
+
% the same dependency as an ordinary Horn rule. The example is intentionally
|
|
4
|
+
% tiny: it demonstrates that a derived fact can be justified by a numeric
|
|
5
|
+
% comparison in the rule body.
|
|
3
6
|
|
|
4
|
-
|
|
5
|
-
% Backward rule example adapted from Eyeling backward.n3.
|
|
6
|
-
% Eyeling writes the interestingness rule backward; eyelang records the same
|
|
7
|
-
% relation as an ordinary rule whose body is the numeric comparison.
|
|
7
|
+
materialize(isIndeedMoreInterestingThan, 2).
|
|
8
8
|
|
|
9
|
-
% Derivation rules: each rule below contributes one logical step toward the displayed results.
|
|
10
9
|
moreInterestingThan(X, Y) :- gt(X, Y).
|
|
11
10
|
|
|
12
11
|
isIndeedMoreInterestingThan(5, 3) :- moreInterestingThan(5, 3).
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
% Memoize shared inference layers: the score vector, disease likelihood tails,
|
|
2
2
|
% and expected therapy success are reused by several report relations.
|
|
3
3
|
% Output declarations: materialize/2 selects the relations written to this example's golden output.
|
|
4
|
+
%
|
|
5
|
+
% Read this as two stacked inference problems: first infer disease posterior
|
|
6
|
+
% probabilities from symptoms, then score each therapy by averaging outcomes
|
|
7
|
+
% over that posterior distribution. The memoized predicates are exactly the
|
|
8
|
+
% shared layers used by several materialized reports.
|
|
4
9
|
materialize(diseases, 2).
|
|
5
10
|
materialize(therapies, 2).
|
|
6
11
|
materialize(evidence, 2).
|
|
@@ -95,6 +100,7 @@ likelihood(Disease, [Evidence|Rest], Likelihood) :-
|
|
|
95
100
|
likelihood(Disease, Rest, TailLikelihood),
|
|
96
101
|
mul(Factor, TailLikelihood, Likelihood).
|
|
97
102
|
|
|
103
|
+
% score/2 combines prior probability with the likelihood of the observed evidence.
|
|
98
104
|
score(Disease, Score) :-
|
|
99
105
|
prior(Disease, Prior),
|
|
100
106
|
evidence(case, Evidence),
|
|
@@ -131,6 +137,7 @@ expected_success(Therapy, ExpectedSuccess) :-
|
|
|
131
137
|
success_by_disease(Therapy, SuccessByDisease),
|
|
132
138
|
dot_product(Posteriors, SuccessByDisease, ExpectedSuccess).
|
|
133
139
|
|
|
140
|
+
% utility/2 turns expected success and adverse effects into a ranking score.
|
|
134
141
|
utility(Therapy, Utility) :-
|
|
135
142
|
expected_success(Therapy, ExpectedSuccess),
|
|
136
143
|
adverse(Therapy, Adverse),
|
|
@@ -1,22 +1,20 @@
|
|
|
1
1
|
% Engineering example: cantilever beam tip deflection.
|
|
2
|
-
%
|
|
3
|
-
% The
|
|
2
|
+
% The beam is modeled with load, span length, elastic modulus, and second moment
|
|
3
|
+
% of area. The rules compute F*L^3/(3*E*I), convert meters to millimeters, and
|
|
4
|
+
% classify the design against a deflection limit.
|
|
4
5
|
|
|
5
|
-
% Output declarations: materialize/2 selects the relations written to this example's golden output.
|
|
6
6
|
materialize(type, 2).
|
|
7
7
|
materialize(tipDeflection_m, 2).
|
|
8
8
|
materialize(tipDeflection_mm, 2).
|
|
9
9
|
materialize(limit_mm, 2).
|
|
10
10
|
materialize(status, 2).
|
|
11
11
|
|
|
12
|
-
% Program structure: facts set up the scenario, and rules derive the materialized conclusions.
|
|
13
12
|
beam(beam1, force_N, 1200.0).
|
|
14
13
|
beam(beam1, length_m, 2.5).
|
|
15
14
|
beam(beam1, elasticModulus_Pa, 200000000000.0).
|
|
16
15
|
beam(beam1, secondMoment_m4, 0.000008).
|
|
17
16
|
limit(beam1, maxDeflection_mm, 5.0).
|
|
18
17
|
|
|
19
|
-
% Derivation rules: each rule below contributes one logical step toward the displayed results.
|
|
20
18
|
tip_deflection_m(Beam, Deflection) :-
|
|
21
19
|
beam(Beam, force_N, Force),
|
|
22
20
|
beam(Beam, length_m, Length),
|
|
@@ -1,4 +1,8 @@
|
|
|
1
1
|
% Binomial coefficients and Vandermonde's identity.
|
|
2
|
+
%
|
|
3
|
+
% choose(N,K,C) is computed by a multiplicative recurrence, then vandermonde/5 checks
|
|
4
|
+
% the finite convolution sum: sum_i C(R,i) C(S,N-i) = C(R+S,N). Memoization keeps
|
|
5
|
+
% the binomial-row prefixes shared across both sides of the identity.
|
|
2
6
|
% choose_step/5 uses the multiplicative recurrence
|
|
3
7
|
% C(N, I+1) = C(N, I) * (N-I) / (I+1)
|
|
4
8
|
% and is memoized because row sums and identities reuse prefixes.
|
|
@@ -10,7 +10,8 @@ materialize(plan, 2).
|
|
|
10
10
|
materialize(finalState, 2).
|
|
11
11
|
materialize(blockCount, 2).
|
|
12
12
|
|
|
13
|
-
%
|
|
13
|
+
% The initial and goal states are lists of on/2 facts. Sorting successor states
|
|
14
|
+
% gives canonical terms for equality and visited-state checks.
|
|
14
15
|
initial([on(a, table), on(b, a), on(c, b), on(d, c), on(e, d)]).
|
|
15
16
|
goal([on(a, table), on(b, a), on(c, table), on(d, c), on(e, d)]).
|
|
16
17
|
|
|
@@ -21,7 +22,8 @@ block(d).
|
|
|
21
22
|
block(e).
|
|
22
23
|
|
|
23
24
|
support(table, _State).
|
|
24
|
-
%
|
|
25
|
+
% move/3 chooses a clear block and a clear support; the bounded planner chains
|
|
26
|
+
% those legal moves while avoiding previously seen states.
|
|
25
27
|
support(Block, State) :-
|
|
26
28
|
block(Block),
|
|
27
29
|
member(on(Block, _Below), State).
|
|
@@ -4,6 +4,10 @@
|
|
|
4
4
|
% inductor ripple current, capacitor ripple voltage, and checks design limits.
|
|
5
5
|
|
|
6
6
|
% Output declarations: materialize/2 selects the relations written to this example's golden output.
|
|
7
|
+
%
|
|
8
|
+
% The constants describe one regulator design. The rules intentionally keep
|
|
9
|
+
% each engineering equation separate so proof output can point to the exact
|
|
10
|
+
% calculation that made the design pass or fail.
|
|
7
11
|
materialize(dutyCycle, 2).
|
|
8
12
|
materialize(inductorRipple_A, 2).
|
|
9
13
|
materialize(rippleRatio, 2).
|
|
@@ -51,6 +55,7 @@ capacitor_ripple_voltage(Converter, RippleVoltage) :-
|
|
|
51
55
|
mul(EightF, Capacitance, Denominator),
|
|
52
56
|
div(RippleCurrent, Denominator, RippleVoltage).
|
|
53
57
|
|
|
58
|
+
% within_ripple_limits/1 is the design gate for ripple current and output voltage.
|
|
54
59
|
within_ripple_limits(Converter) :-
|
|
55
60
|
ripple_ratio(Converter, Ratio),
|
|
56
61
|
limit(Converter, maxRippleRatio, MaxRatio),
|
|
@@ -10,12 +10,14 @@ materialize(averageLatency_ms, 2).
|
|
|
10
10
|
materialize(status, 2).
|
|
11
11
|
materialize(reason, 2).
|
|
12
12
|
|
|
13
|
-
%
|
|
13
|
+
% cache_sample/5 contains hits, misses, and the two latency classes; threshold/3
|
|
14
|
+
% contains the operational targets used by the status rule.
|
|
14
15
|
cache_sample(api_cache, 8600.0, 1400.0, 5.0, 80.0).
|
|
15
16
|
threshold(api_cache, minimum_hit_rate, 0.80).
|
|
16
17
|
threshold(api_cache, maximum_average_latency_ms, 20.0).
|
|
17
18
|
|
|
18
|
-
%
|
|
19
|
+
% The rules compute total requests, hit rate, and weighted latency before
|
|
20
|
+
% applying both acceptance thresholds together.
|
|
19
21
|
total_requests(Cache, Total) :-
|
|
20
22
|
cache_sample(Cache, Hits, Misses, _HitLatency, _MissLatency),
|
|
21
23
|
add(Hits, Misses, Total).
|
|
@@ -10,12 +10,14 @@ materialize(latencyCheck, 2).
|
|
|
10
10
|
materialize(status, 2).
|
|
11
11
|
materialize(reason, 2).
|
|
12
12
|
|
|
13
|
-
%
|
|
13
|
+
% canary/4 records request count, error count, and p95 latency; thresholds
|
|
14
|
+
% make the rollout policy explicit data rather than constants hidden in rules.
|
|
14
15
|
canary(canary42, 5000.0, 75.0, 180.0).
|
|
15
16
|
threshold(canary42, maximum_error_rate, 0.01).
|
|
16
17
|
threshold(canary42, maximum_p95_latency_ms, 200.0).
|
|
17
18
|
|
|
18
|
-
%
|
|
19
|
+
% The latency and error-budget checks are independent so the final rollback
|
|
20
|
+
% reason can point to the failing guard.
|
|
19
21
|
error_rate(Release, Rate) :-
|
|
20
22
|
canary(Release, Requests, Errors, _P95Latency),
|
|
21
23
|
div(Errors, Requests, Rate).
|
|
@@ -1,10 +1,13 @@
|
|
|
1
1
|
% Catalan numbers by memoized convolution.
|
|
2
|
-
%
|
|
3
|
-
%
|
|
2
|
+
%
|
|
3
|
+
% catalan(N,C) sums all splits of N-1 into left and right substructures. The same
|
|
4
|
+
% Catalan values appear in binary tree shapes, parenthesizations, and polygon
|
|
5
|
+
% triangulations, shown here with small wrapper predicates.
|
|
4
6
|
materialize(catalan_answer, 2).
|
|
5
7
|
|
|
6
8
|
memoize(catalan, 2).
|
|
7
9
|
|
|
10
|
+
% C_0 = 1; higher values are computed by the convolution sum.
|
|
8
11
|
catalan(0, 1).
|
|
9
12
|
catalan(N, C) :-
|
|
10
13
|
gt(N, 0),
|
|
@@ -17,6 +20,7 @@ catalan(N, C) :-
|
|
|
17
20
|
mul(A, B, Product)),
|
|
18
21
|
C).
|
|
19
22
|
|
|
23
|
+
% An n-gon has C_(n-2) triangulations.
|
|
20
24
|
polygon_triangulations(Sides, Count) :-
|
|
21
25
|
ge(Sides, 3),
|
|
22
26
|
sub(Sides, 2, N),
|
package/examples/chart-parser.pl
CHANGED
|
@@ -1,10 +1,14 @@
|
|
|
1
1
|
% A tiny memoized chart parser for a context-free grammar.
|
|
2
|
-
%
|
|
3
|
-
%
|
|
2
|
+
%
|
|
3
|
+
% span(Sentence, Category, Start, End) is the dynamic-programming chart item:
|
|
4
|
+
% Category covers a half-open token interval. Memoizing span/4 turns recursive
|
|
5
|
+
% grammar recognition into chart parsing, so ambiguous phrases share subparses.
|
|
4
6
|
materialize(chart_parser_answer, 2).
|
|
5
7
|
|
|
6
8
|
memoize(span, 4).
|
|
7
9
|
|
|
10
|
+
% Two sample sentences share the same tiny grammar but have different parse counts.
|
|
11
|
+
|
|
8
12
|
sentence(command, 5).
|
|
9
13
|
sentence(ambiguous_pp, 8).
|
|
10
14
|
|
|
@@ -38,10 +42,12 @@ rule(vp, verb, np).
|
|
|
38
42
|
rule(vp, vp, pp).
|
|
39
43
|
rule(pp, prep, np).
|
|
40
44
|
|
|
45
|
+
% Lexical chart items come directly from words and terminal categories.
|
|
41
46
|
span(Sentence, Category, Start, End) :-
|
|
42
47
|
word(Sentence, Start, Token),
|
|
43
48
|
terminal(Category, Token),
|
|
44
49
|
add(Start, 1, End).
|
|
50
|
+
% Nonterminal chart items split the interval at a Middle point.
|
|
45
51
|
span(Sentence, Category, Start, End) :-
|
|
46
52
|
rule(Category, Left, Right),
|
|
47
53
|
span(Sentence, Left, Start, Middle),
|
|
@@ -5,6 +5,10 @@
|
|
|
5
5
|
% public relation report.
|
|
6
6
|
|
|
7
7
|
% Output declarations: materialize/2 selects the relations written to this example's golden output.
|
|
8
|
+
%
|
|
9
|
+
% Inclusion criteria are positive requirements; exclusion criteria veto a
|
|
10
|
+
% candidate even when the inclusion checks pass. The emitted reason/2 facts are
|
|
11
|
+
% the audit trail a coordinator would need for a screen-failure report.
|
|
8
12
|
materialize(type, 2).
|
|
9
13
|
materialize(status, 2).
|
|
10
14
|
materialize(reason, 2).
|
|
@@ -58,6 +62,7 @@ exclusion_renal(Patient) :-
|
|
|
58
62
|
exclusion_pregnancy(Patient) :-
|
|
59
63
|
condition(Patient, pregnant).
|
|
60
64
|
|
|
65
|
+
% A patient is eligible only when all inclusion checks pass and no exclusion is proven.
|
|
61
66
|
screen_eligible(Patient) :-
|
|
62
67
|
inclusion_adult(Patient),
|
|
63
68
|
inclusion_diagnosis(Patient),
|
|
@@ -1,15 +1,16 @@
|
|
|
1
1
|
% Eyelet-inspired combinations example using findall/3 and sort/2.
|
|
2
|
-
%
|
|
3
|
-
|
|
4
|
-
%
|
|
2
|
+
%
|
|
3
|
+
% combination/3 generates the same subset in several selection orders. findall/3
|
|
4
|
+
% collects those candidates, and sort/2 canonicalizes the list so each unordered
|
|
5
|
+
% 3-combination of five items is reported once.
|
|
5
6
|
materialize(combinations, 2).
|
|
6
7
|
materialize(count, 2).
|
|
7
8
|
materialize(reason, 2).
|
|
8
9
|
|
|
9
|
-
%
|
|
10
|
-
%
|
|
10
|
+
% select/3 nondeterministically removes one item from a list; because it is an
|
|
11
|
+
% ordinary rule, the example also demonstrates user-level list recursion.
|
|
11
12
|
select(Item, [Item | Rest], Rest).
|
|
12
|
-
%
|
|
13
|
+
% The recursive clause keeps the non-selected head and searches the tail.
|
|
13
14
|
select(Item, [Head | Tail], [Head | Rest]) :-
|
|
14
15
|
select(Item, Tail, Rest).
|
|
15
16
|
|
package/examples/complex.pl
CHANGED
|
@@ -4,6 +4,10 @@
|
|
|
4
4
|
% the pair-shaped pair lists used by the Eyeling source.
|
|
5
5
|
|
|
6
6
|
% Output declarations: materialize/2 selects the relations written to this example's golden output.
|
|
7
|
+
%
|
|
8
|
+
% The example derives arithmetic identities, polar conversions, powers, roots,
|
|
9
|
+
% exponential/trigonometric functions, and distance/normalization results from
|
|
10
|
+
% a small complex-number toolkit.
|
|
7
11
|
materialize(is, 2).
|
|
8
12
|
|
|
9
13
|
% Program structure: facts set up the scenario, and rules derive the materialized conclusions.
|
|
@@ -11,6 +15,7 @@ pi(3.141592653589793).
|
|
|
11
15
|
e(2.718281828459045).
|
|
12
16
|
|
|
13
17
|
% Derivation rules: each rule below contributes one logical step toward the displayed results.
|
|
18
|
+
% z^w is evaluated through polar/log form, exposing useful intermediate proof steps.
|
|
14
19
|
complex_exponentiation([A, B], [C, D], [E, F]) :-
|
|
15
20
|
complex_polar([A, B], [R, T]),
|
|
16
21
|
pow(R, C, Z1),
|
|
@@ -1,9 +1,14 @@
|
|
|
1
1
|
% Convergents of sqrt(2) by memoized recurrence.
|
|
2
|
-
%
|
|
2
|
+
%
|
|
3
|
+
% conv(N, P, Q) gives the Nth numerator/denominator pair for [1; 2, 2, ...].
|
|
4
|
+
% Because each convergent depends on the previous two, memoization avoids the
|
|
5
|
+
% exponential recomputation that the direct Horn-clause recurrence would have.
|
|
6
|
+
% pell_error/2 connects the approximation sequence with P^2 - 2Q^2 = +/-1.
|
|
3
7
|
materialize(convergent_answer, 2).
|
|
4
8
|
|
|
5
9
|
memoize(conv, 3).
|
|
6
10
|
|
|
11
|
+
% Base convergents are 1/1 and 3/2.
|
|
7
12
|
conv(0, 1, 1).
|
|
8
13
|
conv(1, 3, 2).
|
|
9
14
|
conv(N, P, Q) :-
|
|
@@ -17,6 +22,7 @@ conv(N, P, Q) :-
|
|
|
17
22
|
mul(2, Q1, TwiceQ1),
|
|
18
23
|
add(TwiceQ1, Q2, Q).
|
|
19
24
|
|
|
25
|
+
% The signed error alternates between +1 and -1 for these convergents.
|
|
20
26
|
pell_error(N, Error) :-
|
|
21
27
|
conv(N, P, Q),
|
|
22
28
|
mul(P, P, P2),
|
|
@@ -4,6 +4,10 @@
|
|
|
4
4
|
% feedforward compensation, square-root normalization, and nonlinear feedback.
|
|
5
5
|
|
|
6
6
|
% Output declarations: materialize/2 selects the relations written to this example's golden output.
|
|
7
|
+
%
|
|
8
|
+
% Each derived quantity is represented as its own predicate rather than a single
|
|
9
|
+
% formula blob, making the proof trace useful for debugging a failed actuator
|
|
10
|
+
% normalization or control-signal calculation.
|
|
7
11
|
materialize(controlSignal, 2).
|
|
8
12
|
materialize(status, 2).
|
|
9
13
|
materialize(normalizedMeasurement, 2).
|
|
@@ -1,11 +1,15 @@
|
|
|
1
1
|
% Critical-path scheduling for a small project network.
|
|
2
|
-
%
|
|
3
|
-
%
|
|
2
|
+
%
|
|
3
|
+
% earliest_start/2 is the maximum finish time over all predecessors; finish_time/2
|
|
4
|
+
% adds task duration. Critical tasks are reconstructed by following predecessors
|
|
5
|
+
% that attain those maxima. Memoization lets the schedule, finish date, and path
|
|
6
|
+
% queries share the same project-network subproblems.
|
|
4
7
|
materialize(critical_path_answer, 2).
|
|
5
8
|
|
|
6
9
|
memoize(earliest_start, 2).
|
|
7
10
|
memoize(finish_time, 2).
|
|
8
11
|
|
|
12
|
+
% Durations are in arbitrary project time units.
|
|
9
13
|
task(requirements, 2).
|
|
10
14
|
task(architecture, 3).
|
|
11
15
|
task(api_design, 2).
|
|
@@ -47,6 +51,7 @@ finish_time(Task, Finish) :-
|
|
|
47
51
|
earliest_start(Task, Start),
|
|
48
52
|
add(Start, Duration, Finish).
|
|
49
53
|
|
|
54
|
+
% For each task, choose a predecessor that determines its earliest start.
|
|
50
55
|
critical_predecessor(Task, Pred) :-
|
|
51
56
|
depends(Task, _AnyPred),
|
|
52
57
|
aggregate_max(Finish, P,
|
package/examples/cyclic-path.pl
CHANGED
|
@@ -1,16 +1,18 @@
|
|
|
1
|
-
% Cyclic transitive closure.
|
|
2
|
-
%
|
|
3
|
-
%
|
|
1
|
+
% Cyclic transitive closure.
|
|
2
|
+
%
|
|
3
|
+
% The graph deliberately contains the directed cycle a -> b -> c -> d -> a. The
|
|
4
|
+
% recursive path/2 rule therefore has to deal with cycles while still deriving
|
|
5
|
+
% the reachable pairs used by the golden output.
|
|
6
|
+
%
|
|
7
|
+
% This is a compact regression-style example for active-goal handling in recursive
|
|
8
|
+
% graph search.
|
|
4
9
|
|
|
5
|
-
% Output declarations: materialize/2 selects the relations written to this example's golden output.
|
|
6
10
|
materialize(path, 2).
|
|
7
11
|
|
|
8
|
-
% Program structure: facts set up the scenario, and rules derive the materialized conclusions.
|
|
9
12
|
arc(a, b).
|
|
10
13
|
arc(b, c).
|
|
11
14
|
arc(c, d).
|
|
12
15
|
arc(d, a).
|
|
13
16
|
|
|
14
|
-
% Derivation rules: each rule below contributes one logical step toward the displayed results.
|
|
15
17
|
path(X, Y) :- arc(X, Y).
|
|
16
18
|
path(X, Z) :- arc(X, Y), path(Y, Z).
|
package/examples/d3-group.pl
CHANGED
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
% Eyelet-inspired D3 group example using findall/3 and sort/2.
|
|
2
|
-
%
|
|
2
|
+
% The six facts are the symmetries of an equilateral triangle, with compose/3 as
|
|
3
|
+
% the Cayley table and inverse/2 as the inverse relation. Candidate subsets are
|
|
4
|
+
% generated as subsequences, then filtered for subgroup closure.
|
|
3
5
|
|
|
4
|
-
% Output declarations: materialize/2 selects the relations written to this example's golden output.
|
|
5
6
|
materialize(subgroups, 2).
|
|
6
7
|
materialize(subgroupCount, 2).
|
|
7
8
|
materialize(reason, 2).
|
|
8
9
|
|
|
9
|
-
% Program structure: facts set up the scenario, and rules derive the materialized conclusions.
|
|
10
10
|
% Six symmetries of an equilateral triangle: identity, rotations, reflections.
|
|
11
11
|
symmetry(identity).
|
|
12
12
|
symmetry(rotation_120).
|
|
@@ -62,7 +62,6 @@ inverse(reflection_c, reflection_c).
|
|
|
62
62
|
|
|
63
63
|
% Candidate subsets are generated as subsequences of the sorted symmetry list.
|
|
64
64
|
subsequence([], []).
|
|
65
|
-
% Derivation rules: each rule below contributes one logical step toward the displayed results.
|
|
66
65
|
subsequence([Head | Tail], [Head | Rest]) :-
|
|
67
66
|
subsequence(Tail, Rest).
|
|
68
67
|
subsequence([_Head | Tail], Rest) :-
|
|
@@ -1,21 +1,21 @@
|
|
|
1
1
|
% EYE-inspired dairy energy balance case study.
|
|
2
|
-
%
|
|
3
|
-
|
|
4
|
-
%
|
|
5
|
-
%
|
|
2
|
+
%
|
|
3
|
+
% cow(Cow, BodyWeightKg, MilkKgPerDay, RationEnergyMcalPerKgDM, IntakeKgDM)
|
|
4
|
+
% records a small herd. Rules estimate maintenance demand, milk-production
|
|
5
|
+
% demand, ration supply, and the resulting energy-balance class.
|
|
6
6
|
materialize(energyBalance_Mcal, 2).
|
|
7
7
|
materialize(rationSupportedMilk_kg, 2).
|
|
8
8
|
materialize(status, 2).
|
|
9
9
|
materialize(reason, 2).
|
|
10
10
|
materialize(strongestDeficit, 2).
|
|
11
11
|
|
|
12
|
-
%
|
|
12
|
+
% Four cows cover negative, near-neutral, and positive balance cases.
|
|
13
13
|
cow(early_lactation, 650, 38, 6.4, 22).
|
|
14
14
|
cow(mid_lactation, 610, 24, 6.5, 26).
|
|
15
15
|
cow(late_lactation, 580, 16, 6.7, 25).
|
|
16
16
|
cow(grazing, 540, 18, 5.8, 21).
|
|
17
17
|
|
|
18
|
-
%
|
|
18
|
+
% Maintenance scales with body weight; milk requirement scales with daily milk.
|
|
19
19
|
maintenance(C, M) :-
|
|
20
20
|
cow(C, Weight, _, _, _),
|
|
21
21
|
mul(Weight, 0.08, M).
|
|
@@ -33,6 +33,7 @@ total_requirement(C, R) :-
|
|
|
33
33
|
milk_requirement(C, MilkR),
|
|
34
34
|
add(M, MilkR, R).
|
|
35
35
|
|
|
36
|
+
% energy_balance/2 is intake minus maintenance and milk-production demand.
|
|
36
37
|
energy_balance(C, B) :-
|
|
37
38
|
ration_supply(C, S),
|
|
38
39
|
total_requirement(C, R),
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
% Data negotiation with policies, adapted from Eyelet input/data-negotiation.pl.
|
|
2
|
-
%
|
|
2
|
+
% Two agents own different datasets. A negotiation succeeds only when the
|
|
3
|
+
% requester lacks the data, the provider has it, the requester policy allows
|
|
4
|
+
% asking for it, and the provider policy allows sharing it.
|
|
3
5
|
|
|
4
|
-
% Output declarations: materialize/2 selects the relations written to this example's golden output.
|
|
5
6
|
materialize(negotiate, 2).
|
|
6
7
|
|
|
7
|
-
% Program structure: facts set up the scenario, and rules derive the materialized conclusions.
|
|
8
8
|
% Each agent has local data, desired remote data, and a simple policy.
|
|
9
9
|
hasData(agent1, [data1, data2, data3]).
|
|
10
10
|
hasData(agent2, [data4, data5, data6]).
|
|
@@ -13,7 +13,6 @@ want_negotiate(agent1, [agent2, data4]).
|
|
|
13
13
|
want_negotiate(agent1, [agent2, data5]).
|
|
14
14
|
want_negotiate(agent1, [agent2, data7]).
|
|
15
15
|
|
|
16
|
-
% Derivation rules: each rule below contributes one logical step toward the displayed results.
|
|
17
16
|
policy(agent1, [request, Data]) :-
|
|
18
17
|
member(Data, [data4, data6]).
|
|
19
18
|
policy(agent2, [accept, Data]) :-
|
|
@@ -1,11 +1,12 @@
|
|
|
1
1
|
% Deontic logic: obligations, prohibitions, compensations, and violations.
|
|
2
|
+
% The example separates normative facts from observed actions. Missing an
|
|
3
|
+
% obligation and performing a prohibited action are violations, but a prohibited
|
|
4
|
+
% action can be marked compensated when the configured repair action occurred.
|
|
2
5
|
|
|
3
|
-
% Output declarations: materialize/2 selects the relations written to this example's golden output.
|
|
4
6
|
materialize(violation, 2).
|
|
5
7
|
materialize(compensation, 2).
|
|
6
8
|
materialize(status, 2).
|
|
7
9
|
|
|
8
|
-
% Program structure: facts set up the scenario, and rules derive the materialized conclusions.
|
|
9
10
|
% Facts state what the actor was obliged/prohibited to do and what happened.
|
|
10
11
|
actor(alice).
|
|
11
12
|
action(share_record).
|
|
@@ -21,7 +22,6 @@ not_performed(alice, obtain_consent).
|
|
|
21
22
|
not_performed(alice, delete_unneeded_copy).
|
|
22
23
|
|
|
23
24
|
% Missing an obligation and performing a prohibited action are both violations.
|
|
24
|
-
% Derivation rules: each rule below contributes one logical step toward the displayed results.
|
|
25
25
|
violation(Actor, missed_obligation(Action)) :-
|
|
26
26
|
obliged(Actor, Action),
|
|
27
27
|
not_performed(Actor, Action).
|
|
@@ -1,12 +1,12 @@
|
|
|
1
1
|
% Eyelet-inspired Dijkstra example using findall/3 and sort/2.
|
|
2
|
-
%
|
|
2
|
+
% The priority queue is represented as sorted list entries [Cost, Node | Path].
|
|
3
|
+
% Each expansion collects unvisited neighbors with findall/3, appends them to
|
|
4
|
+
% the frontier, and uses sort/2 so the cheapest frontier entry is processed next.
|
|
3
5
|
|
|
4
|
-
% Output declarations: materialize/2 selects the relations written to this example's golden output.
|
|
5
6
|
materialize(shortestPath, 2).
|
|
6
7
|
materialize(cost, 2).
|
|
7
8
|
materialize(reason, 2).
|
|
8
9
|
|
|
9
|
-
% Program structure: facts set up the scenario, and rules derive the materialized conclusions.
|
|
10
10
|
% Weighted undirected graph; the symmetric edge rule below adds reverse arcs.
|
|
11
11
|
edge(a, b, 4).
|
|
12
12
|
edge(a, c, 2).
|
|
@@ -17,7 +17,6 @@ edge(c, e, 10).
|
|
|
17
17
|
edge(d, e, 2).
|
|
18
18
|
edge(d, f, 6).
|
|
19
19
|
edge(e, f, 3).
|
|
20
|
-
% Derivation rules: each rule below contributes one logical step toward the displayed results.
|
|
21
20
|
edge(A, B, Cost) :- edge(B, A, Cost).
|
|
22
21
|
|
|
23
22
|
% The frontier is represented as [Cost, Node | ReversePath] entries.
|