2017-08-11 30 views
2

MiniKanren有没有“不”操作符?MiniKanren是否有“不”操作符?

例如,如何将一个代表的Prolog的

a :- b, not(c) 

a为真,如果b是真实的,c不是(Prolog使用否定为失败,not(c)被认为是成熟的,如果c不能被证明)

Prolog's not也适用于非基础表达式,eg

a(X, d(Y)) :- b(d(X), d(Y)), not(c(d(X))) 

回答

1

根据https://github.com/zhjhxxxjh/ykanren答案是否定的。

+0

core.logic仍然允许[否定为失败(https://开头组。尽管如此,google.com/forum/#!topic/clojure/hz63yeQfiQE)。 –

+0

@AndersonGreen和Prolog的'not'完全等价吗? (见编辑) – MaxB

0

有一个在minikanren没有not运营商,但你可以实现与conda类似的东西:

(defmacro not 
    "fail if the given goal succeeds, use with extreme caution" 
    [goal] 
    `(conda 
    [~goal fail] 
    [succeed])) 

my similar question on Google Groups

+0

我是否正确地理解这与Prolog的不同? (请参阅编辑) – MaxB

+0

@MaxB我会认为它与Prolog的不一样,因为它们都是成功的,如果它们的论证在特定时刻无法证明的话。但是,我对逻辑编程并不熟悉,否定是棘手的,所以如果我错了,我不会感到惊讶。 –

+0

据我所知,这个miniKanren构造不能处理变量,如第二个例子。 – MaxB

相关问题