假设我们matches
通过下表定义一个关系:
|-----+-----+-----+-----+-----|
| | *A* | *B* | *C* | *D* |
|-----+-----+-----+-----+-----|
| *A* | | X | X | |
|-----+-----+-----+-----+-----|
| *B* | X | | | X |
|-----+-----+-----+-----+-----|
| *C* | X | | | |
|-----+-----+-----+-----+-----|
| *D* | | X | | |
|-----+-----+-----+-----+-----|
这意味着(在伪代码中)
(matches A) ;=> (B C)
(matches B) ;=> (A D)
(matches C) ;=> (C)
(matches D) ;=> (B)
在 core.logic 中,我想我会知道如何制作可以近似于以下行为的个性化函数matches
:
(defn matches-A
(run* [q]
(membero q [B C]))) ;=> (B C)
...等等对于matches-B
和matches-C
。
问题:我如何概括,即,如上所述matches-A
的单个函数?matches
特别是,我有兴趣制作它,以便您可以运行类似(matches "not A")
,(matches "B and C")
和(matches "C or D")
(在伪代码中)的查询来分别获得类似(A D)
,(A)
和的结果(A B)
。这可能吗?
注意:我使用的是 clojurescript 而不是 clojure。我不确定这是否会影响答案。