12 Glossary of Racklog Primitives
12.1 Racket Predicates
Identifies a logic variable.
A contract for goals.
12.2 User Interface
Returns an
answer?
of the variables
V, ..., that satisfies all of
G,
... If
G, ..., cannot be satisfied, returns
#f.
Calling the thunk
%more produces more
instantiations, if available.
The thunk
%more produces more instantiations of the
variables in the most recent
%which-form that satisfy the
goals in that
%which-form. If no more solutions can
be found,
%more returns
#f.
Like
(list (%which (V ...) G ...) (%more) ...) with as many
(%more)s as there are answers. (This will not terminate if there are an infinite number of answers.)
12.3 Relations
(%rel (V ...) clause ...)
|
|
|
|
|
Returns a predicate function. Each clause
C signifies that
the goal created by applying the predicate object to anything that
matches
(E ...) is deemed to succeed if all the goals
G, ..., can, in their turn, be shown to succeed. The
variables
V, ..., are local logic variables for
clause, ....
Adds the clauses
clauses, ..., to the end of the predicate that is the value of
the Racket variable Pname. The variables V, ..., are
local logic variables for clause, ....
Like
%assert!, but adds the new clauses to the
front
of the existing predicate.
12.4 Racklog Variables
A thunk that produces a new logic variable. Can be
used in situations where we want a logic variable but
don’t want to name it. (
%let, in contrast, introduces new
lexical names for the logic variables it creates.)
Introduces V, ..., as
lexically scoped logic variables to be used in expr, ...
12.5 Cut
May only be used syntactically inside %cut-delimiter or %rel.
12.6 Racklog Operators
The goal
%fail always fails.
The goal
%true succeeds. Fails on retry.
The goal
(%repeat) always succeeds (even on retries).
Useful for failure-driven loops.
The goal
(%and G ...) succeeds if all the goals
G, ..., succeed.
The goal
(%or G ...) succeeds if one of
G, ..., tried
in that order, succeeds.
The goal
(%not G) succeeds if
G fails.
The goal
(%if-then-else G1 G2 G3) tries
G1 first: if it
succeeds, tries
G2; if not, tries
G3.
12.7 Unification
The goal
(%= E1 E2) succeeds if
E1 can be unified with
E2. Any resulting bindings for logic variables are kept.
%/= is the negation of
%=.
The goal
(%/= E1 E2) succeeds if
E1 can not be unified
with
E2.
The goal
(%== E1 E2) succeeds if
E1 is
identical
to
E2. They should be structurally equal. If containing
logic variables, they should have the same variables in the
same position. Unlike a
%=-call, this goal will not bind
any logic variables.
%/== is the negation of
%==.
The goal
(%/== E1 E2) succeeds if
E1 and
E2 are not
identical.
The goal
(%is E1 E2) unifies with
E1 the result of
evaluating
E2 as a Racket expression.
E2 may contain
logic variables, which are dereferenced automatically.
Fails if
E2 contains unbound logic variables.
If this is false (the default),
Racklog’s unification will not use the occurs check.
If it is true, the occurs check is enabled.
12.8 Numeric Predicates
The goal
(%< E1 E2) succeeds if
E1 and
E2 are bound to
numbers and
E1 is less than
E2.
The goal
(%<= E1 E2) succeeds if
E1 and
E2 are bound to
numbers and
E1 is less than or equal to
E2.
The goal
(%=/= E1 E2) succeeds if
E1 and
E2 are bound to
numbers and
E1 is not equal to
E2.
The goal
(%=:= E1 E2) succeeds if
E1 and
E2 are bound to
numbers and
E1 is equal to
E2.
The goal
(%> E1 E2) succeeds if
E1 and
E2 are bound to
numbers and
E1 is greater than
E2.
The goal
(%>= E1 E2) succeeds if
E1 and
E2 are bound to
numbers and
E1 is greater than or equal to
E2.
12.9 List Predicates
The goal
(%append E1 E2 E3) succeeds if
E3 is unifiable
with the list obtained by appending
E1 and
E2.
The goal
(%member E1 E2) succeeds if
E1 is a member
of the list in
E2.
12.10 Set Predicates
The goal
(%set-of E1 G E2) unifies with
E2 the
set
of all the
instantiations of
E1 for which goal
G succeeds.
Similar to
%set-of, but fails if the set is empty.
The goal
(%bag-of E1 G E2) unifies with
E2 the
bag
(multiset)
of all the
instantiations of
E1 for which goal
G succeeds.
Similar to
%bag-of, but fails if the bag is empty.
Identifies
the occurrences of the variables
V, ..., in goal
G as free. It is used to avoid existential quantification
in calls to set predicates (
%bag-of,
%set-of, &c.).
12.11 Racklog Predicates
The goal
(%compound E) succeeds if
E is a compound
value.
The goal
(%constant E) succeeds if
E is an atomic
value.
The goal
(%var E) succeeds if
E is not completely
instantiated, ie, it has at least one unbound variable in
it.
%nonvar is the negation of
%var.
The goal
(%nonvar E) succeeds if
E is completely
instantiated, ie, it has no unbound variable in it.
12.12 Higher-order Predicates
The goal
(%apply P L) succeeds if
L is a list
with elements
E, ..., and if
P is a predicate
accepting as many arguments as there are
Es, and if the goal
(P E ...) succeeds.
The goal will fail if L is not sufficiently instantiated
to determine its length.
For example, the goal
is equivalent to
which succeeds if X can be unified with 1.
The goal
(%andmap P L ...) succeeds if all the values
L, ..., are lists of equal length, and if the goal
(P E ...) succeeds for each set of values
E, ...,
taken in turn from each of the lists
L, ...
As an example, in particular the goal
(%andmap %<= '(1 2 3) '(4 5 6)) is equivalent to
12.13 Racklog Variable Manipulation
The goal
(%freeze S F) unifies with
F a new frozen
version of the structure in
S. Freezing implies that all
the unbound variables are preserved.
F can henceforth be
used as
bound object with no fear of its variables
getting bound by unification.
The goal
(%melt F S) unifies
S with the thawed
(original) form of the frozen structure in
F.
The goal
(%melt-new F S) unifies
S with a thawed
copy of the frozen structure in
F. This means
new logic variables are used for unbound logic variables in
F.
The goal
(%copy F S) unifies with
S a copy of the
frozen structure in
F.