6 Conjuctions and Disjunctions
Goals may be combined using the forms %and and %or to form compound goals. (For %not, see Negation as Failure.) Eg,
| |||
'((x . 1)) |
gives solutions for x that satisfy both the argument goals of the %and. Ie, x should both be a member of '(1 2 3) and be less than 3. Typing (%more) gives another solution:
> (%more) |
'((x . 2)) |
> (%more) |
#f |
There are no more solutions, because [x 3] satisfies the first but not the second goal.
Similarly, the query
| |||
'((x . 1)) |
lists all x that are members of either list.
> (%more) |
'((x . 2)) |
> (%more) |
'((x . 3)) |
> (%more) |
'((x . 3)) |
> (%more) |
'((x . 4)) |
> (%more) |
'((x . 5)) |
(Yes, ([x 3]) is listed twice.)
We can rewrite the predicate %computer-literate from Predicates with Rules using %and and %or:
(define %computer-literate |
(%rel (person) |
[(person) |
(%or |
(%and (%knows person |
'TeX) |
(%knows person |
'Racket)) |
(%and (%knows person |
'TeX) |
(%knows person |
'Prolog)))])) |
Or, more succinctly:
(define %computer-literate |
(%rel (person) |
[(person) |
(%and (%knows person |
'TeX) |
(%or (%knows person |
'Racket) |
(%knows person |
'Prolog)))])) |
We can even dispense with the %rel altogether:
(define %computer-literate |
(lambda (person) |
(%and (%knows person |
'TeX) |
(%or (%knows person |
'Racket) |
(%knows person |
'Prolog))))) |
This last looks like a conventional Racket predicate definition, and is arguably the most readable format for a Racket programmer.