试图使用Logic解决python中的以下问题:
from kanren import run, eq, membero, var, conde
from kanren.constraints import neq, isinstanceo
rules = (eq, (var(), var(), var(), var()), people),
(membero, (4, x, ('Steve' , var() , 'blue' , var() ), people)),
(membero, (4, x, ( var() , 'cat' , var() , 'Canada' ), people)),
(membero, (4, x, ('Matthew', var() , var() , 'USA' ), people)),
(membero, (4, x, ( var() , var() , 'black', 'Australia'), people)),
(membero, (4, x, ('Jack' , 'cat' , var() , var() ), people)),
(membero, (4, x, ('Alfred' , var() , var() , 'Australia'), people)),
(membero, (4, x, ( var() , 'dog' , var() , 'France' ), people)),
(membero, (4, x, ( var() , 'rabbit', var() , var() ), people))
结果在:
(<function kanren.goals.membero(x, ls)>,
(4, ~_2, (~_2422, 'rabbit', ~_2423, ~_2424), ~_809))
这让我无法运行
solutions = run(0, people, rules)
你能帮我解决问题吗?
谢谢。
不确定您使用的是什么版本的kanren
,但在最新版本下肯定无法正常工作。这似乎产生了一个结果:
people = var()
things = lall(eq((var(), var(), var(), var()), people),
membero(('Steve', var(), 'blue', var()), people),
membero((var(), 'cat', var(), 'Canada'), people),
membero(('Matthew', var(), var(), 'USA'), people),
membero((var(), var(), 'black', 'Australia'), people),
membero(('Jack', 'cat', var(), var()), people),
membero(('Alfred', var(), var(), 'Australia'), people),
membero((var(), 'dog', var(), 'France'), people),
membero((var(), 'rabbit', var(), var()), people)
solutions = run(0, people, things)
它产生了许多解决方案,但我认为它们只是彼此的排列。也许它可以像这样做得更紧:
people = var()
things = lall(eq((('Steve', var(), var(), var()),
('Matthew', var(), var(), var()),
('Jack', var(), var(), var()),
('Alfred', var(), var(), var())),
people),
membero(('Steve', var(), 'blue', var()), people),
membero((var(), 'cat', var(), 'Canada'), people),
membero(('Matthew', var(), var(), 'USA'), people),
membero((var(), var(), 'black', 'Australia'), people),
membero(('Jack', 'cat', var(), var()), people),
membero(('Alfred', var(), var(), 'Australia'), people),
membero((var(), 'dog', var(), 'France'), people),
membero((var(), 'rabbit', var(), var()), people)
)
solutions = run(0, people, things)
这个仍然导致了两个解决方案,这两个方案对我来说都是一样的。
(('Alfred', ~_16, 'black', 'Australia'),
('Jack', 'cat', ~_14, 'Canada'),
('Matthew', 'rabbit', ~_21, 'USA'),
('Steve', 'dog', 'blue', 'France'))
当然,只要提到三种动物和两种颜色,你就会得到这些。
我可以看出你可能从哪里得到了最初问题的语法:它可能在这里吗?我希望我能让这个谜题继续下去,但我所做的一切都不适用…
更新
与kanren
的开发人员进行了非常有益的交流。看看