11 Glossary of Racklog Primitives
11.1 Racket Predicates
函数
(logic-var? x) → boolean?
x : any/c
Identifies a logic variable.
函数
(atomic-struct? x) → boolean?
x : any/c
Identifies atomic values that may appear in Racklog programs. Equivalent to
the contract (or/c boolean? number? string? bytes? char? symbol? regexp? pregexp? byte-regexp? byte-pregexp? keyword? null? procedure? void? set? atomic-struct?).
函数
(compound-struct? x) → boolean?
x : any/c
Identifies compound values that may appear in Racklog programs. Equivalent to
the contract
(or/c pair? vector? mpair? box? hash? compound-struct?).
函数
(unifiable? x) → boolean?
x : any/c
Identifies values that may appear in Racklog programs. Essentially either an
atom?, logic-var?, or compound? that contains
unifiable?s.
函数
(answer-value? x) → boolean?
x : any/c
Identifies values that may appear in answer?. Essentially
unifiable?s that do not contain logic-var?s.
Identifies answers returned by %more and %which. Equivalent
to the contract
(or/c false/c (listof (cons/c symbol? answer-value?))).
A contract for goals.
11.2 User Interface
语法
(%which (V ...) G ...)
V : identifier?
G : goal/c
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.
语法
(%find-all (V ...) G ...)
V : identifier?
G : goal/c
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.)
11.3 Relations
语法
(%rel (V ...) clause ...)
clause = [(E ...) G ...]
V : identifier?
E : expression?
G : goal/c
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, ....
函数
(%empty-rel E ...) → goal/c
E : unifiable?
The goal (%empty-rel E ...) always fails. The value
%empty-rel is used as a starting value for predicates
that can later be enhanced with %assert! and %assert-after!.
语法
(%assert! Pname (V ...) clause ...)
Pname : identifier?
V : identifier?
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, ....
语法
(%assert-after! Pname (V ...) clause ...)
Pname : identifier?
V : identifier?
Like %assert!, but adds the new clauses to the front
of the existing predicate.
11.4 Racklog Variables
函数
(_) → logic-var?
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.)
语法
(%let (V ...) expr ...)
V : identifier?
Introduces V, ..., as
lexically scoped logic variables to be used in expr, ...
11.5 Cut
语法
(%cut-delimiter . any)
Introduces a cut point. See The Cut (!).
语法
The cut goal, see The Cut (!).
May only be used syntactically inside %cut-delimiter or %rel.
11.6 Racklog Operators
The goal %fail always fails.
The goal %true succeeds. Fails on retry.
函数
(%if-then-else G1 G2 G3) → goal/c
G1 : goal/c G2 : goal/c G3 : goal/c
11.7 Unification
函数
E1 : unifiable? E2 : unifiable?
The goal (%= E1 E2) succeeds if E1 can be unified with
E2. Any resulting bindings for logic variables are kept.
函数
E1 : unifiable? E2 : unifiable?
函数
E1 : unifiable? E2 : unifiable?
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.
函数
E1 : unifiable? E2 : unifiable?
语法
(%is E1 E2)
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.
parameter
(use-occurs-check? on?) → void? on? : boolean?
If this is false (the default),
Racklog’s unification will not use the occurs check.
If it is true, the occurs check is enabled.
11.8 Numeric Predicates
函数
E1 : unifiable? E2 : unifiable?
函数
E1 : unifiable? E2 : unifiable?
函数
E1 : unifiable? E2 : unifiable?
函数
E1 : unifiable? E2 : unifiable?
函数
E1 : unifiable? E2 : unifiable?
函数
E1 : unifiable? E2 : unifiable?
The goal (%>= E1 E2) succeeds if E1 and E2 are bound to
numbers and E1 is greater than or equal to E2.
11.9 List Predicates
函数
E1 : unifiable? E2 : unifiable? E3 : unifiable?
The goal (%append E1 E2 E3) succeeds if E3 is unifiable
with the list obtained by appending E1 and E2.
函数
E1 : unifiable? E2 : unifiable?
11.10 Set Predicates
函数
E1 : unifiable? G : goal/c E2 : unifiable?
The goal (%set-of E1 G E2) unifies with E2 the set
of all the
instantiations of E1 for which goal G succeeds.
函数
E1 : unifiable? G : goal/c E2 : unifiable?
Similar to %set-of, but fails if the set is empty.
函数
E1 : unifiable? G : goal/c E2 : unifiable?
The goal (%bag-of E1 G E2) unifies with E2 the bag
(multiset)
of all the
instantiations of E1 for which goal G succeeds.
函数
E1 : unifiable? G : goal/c E2 : unifiable?
Similar to %bag-of, but fails if the bag is empty.
语法
(%free-vars (V ...) G)
V : identifier?
G : goal/c
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.).
11.11 Racklog Predicates
函数
E : unifiable?
函数
E : unifiable?
函数
E : unifiable?
The goal (%var E) succeeds if E is not completely
instantiated, ie, it has at least one unbound variable in
it.
函数
E : unifiable?
%nonvar is the negation of %var.
The goal (%nonvar E) succeeds if E is completely
instantiated, ie, it has no unbound variable in it.
11.12 Racklog Variable Manipulation
函数
S : unifiable? F : unifiable?
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.
函数
F : unifiable? S : unifiable?
函数
F : unifiable? S : unifiable?
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.
函数
F : unifiable? S : unifiable?