python逻辑谜题关系



试图使用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的开发人员进行了非常有益的交流。看看

最新更新