I think it may be useful to be able to tie multiple noms in one binder, with or without significant order.
A couple use cases I've thought of so far:
Lambdas in a non-currying language. Here order matters.
(== (list 'fn (ties [x y] (list '+ x y)))
(list 'fn (ties [z w] (list '+ z w)))
My original use case, free/quantified variables in logical formulas. Order doesn't matter (note the second body has its noms swapped).
(== (list '∀ (ties #{x y} (list '= (list '+ x y) (list '+ y x))))
(list '∀ (ties #{z w} (list '= (list '+ w z) (list '+ z w)))))
I have a draft implementation here:
https://github.com/tomjack/core.logic/compare/ties
Possible issues with this implementation:
- Is it OK to reextend IWalkTerm to IPersistentSet?
- Should Tie and Ties present a uniform interface? (e.g. (tie? (ties #{x} x)))