我正在用core.logic建模一个家谱.我想run*查询并让他们返回所有结果而不重复.更换所有defn有def tabled给我我所期望的结果(至少目前),我知道condu并onceo能减少结果的数量,但我不知道如果任这些都是消除重复的最佳途径.
我特别担心我目前的做法,因为宣布关系和功能似乎是重复的工作.我知道我的一些关系是"相互递归"(mothero并互相womano引用),但我这样做是因为将来我可能会添加一个新的(defrel mother*),这应该可以让它推断出母亲既是父母又是女人.
(defrel man* person)
(defrel woman* person)
(defrel parent* child father)
(fact man* :Father)
(fact woman* :Mother)
(fact man* :Son)
(fact woman* :Daughter)
(fact parent* :Son :Father)
(fact parent* :Son :Mother)
(fact parent* :Daughter :Father)
(fact parent* :Daughter :Mother)
(defn mano [person]
(conde
[(man* person)]
[(fresh [c]
(fathero c person))]))
(defn womano [person]
(conde
[(woman* person)]
[(fresh [c]
(mothero …Run Code Online (Sandbox Code Playgroud) 我是Haskell的新手,并且正在尝试使用实例创建一个类.
我有以下代码,我试图说:1)分支可以在其第一个位置保持任何类型,2)创建一个类线性,它取线性的东西,并返回一个数字3)使分支成为线性的实例,如果分支持有的第一件事是Num类的一部分.
data Branch a = Branch a Integer deriving (Show, Eq)
class Linear l where
length :: (Num a) => l -> a
instance (Num a) => Linear (Branch a) where
length (Branch len _) = len
Run Code Online (Sandbox Code Playgroud)
我得到错误:无法推断(a~a1)来自实例声明绑定的上下文(Num a).....
有谁知道如何在Haskell中表达我想说的是什么?