谁喝水谁养斑马答案C语言,以编程方式解决"谁拥有斑马"?

DreadPirateS..

8

另一个Python解决方案,这次使用Python的PyKE(Python知识引擎).当然,它比@JFSebastian在解决方案中使用Python的"约束"模块更加冗长,但它为任何寻找这类问题的原始知识引擎的人提供了一个有趣的比较.

clues.kfb

categories( POSITION, 1, 2, 3, 4, 5 ) # There are five houses.

categories( HOUSE_COLOR, blue, red, green, white, yellow ) # Each house has its own unique color.

categories( NATIONALITY, Norwegian, German, Dane, Swede, English ) # All house owners are of different nationalities.

categories( PET, birds, dog, cats, horse, zebra ) # They all have different pets.

categories( DRINK, tea, coffee, milk, beer, water ) # They all drink different drinks.

categories( SMOKE, Blend, Prince, 'Blue Master', Dunhill, 'Pall Mall' ) # They all smoke different cigarettes.

related( NATIONALITY, English, HOUSE_COLOR, red ) # The English man lives in the red house.

related( NATIONALITY, Swede, PET, dog ) # The Swede has a dog.

related( NATIONALITY, Dane, DRINK, tea ) # The Dane drinks tea.

left_of( HOUSE_COLOR, green, HOUSE_COLOR, white ) # The green house is on the left side of the white house.

related( DRINK, coffee, HOUSE_COLOR, green ) # They drink coffee in the green house.

related( SMOKE, 'Pall Mall', PET, birds ) # The man who smokes Pall Mall has birds.

related( SMOKE, Dunhill, HOUSE_COLOR, yellow ) # In the yellow house they smoke Dunhill.

related( POSITION, 3, DRINK, milk ) # In the middle house they drink milk.

related( NATIONALITY, Norwegian, POSITION, 1 ) # The Norwegian lives in the first house.

next_to( SMOKE, Blend, PET, cats ) # The man who smokes Blend lives in the house next to the house with cats.

next_to( SMOKE, Dunhill, PET, horse ) # In the house next to the house where they have a horse, they smoke Dunhill.

related( SMOKE, 'Blue Master', DRINK, beer ) # The man who smokes Blue Master drinks beer.

related( NATIONALITY, German, SMOKE, Prince ) # The German smokes Prince.

next_to( NATIONALITY, Norwegian, HOUSE_COLOR, blue ) # The Norwegian lives next to the blue house.

next_to( DRINK, water, SMOKE, Blend ) # They drink water in the house next to the house where they smoke Blend.

relations.krb

#############

# Categories

# Foreach set of categories, assert each type

categories

foreach

clues.categories($category, $thing1, $thing2, $thing3, $thing4, $thing5)

assert

clues.is_category($category, $thing1)

clues.is_category($category, $thing2)

clues.is_category($category, $thing3)

clues.is_category($category, $thing4)

clues.is_category($category, $thing5)

#########################

# Inverse Relationships

# Foreach A=1, assert 1=A

inverse_relationship_positive

foreach

clues.related($category1, $thing1, $category2, $thing2)

assert

clues.related($category2, $thing2, $category1, $thing1)

# Foreach A!1, assert 1!A

inverse_relationship_negative

foreach

clues.not_related($category1, $thing1, $category2, $thing2)

assert

clues.not_related($category2, $thing2, $category1, $thing1)

# Foreach "A beside B", assert "B beside A"

inverse_relationship_beside

foreach

clues.next_to($category1, $thing1, $category2, $thing2)

assert

clues.next_to($category2, $thing2, $category1, $thing1)

###########################

# Transitive Relationships

# Foreach A=1 and 1=a, assert A=a

transitive_positive

foreach

clues.related($category1, $thing1, $category2, $thing2)

clues.related($category2, $thing2, $category3, $thing3)

check unique($thing1, $thing2, $thing3) \

and unique($category1, $category2, $category3)

assert

clues.related($category1, $thing1, $category3, $thing3)

# Foreach A=1 and 1!a, assert A!a

transitive_negative

foreach

clues.related($category1, $thing1, $category2, $thing2)

clues.not_related($category2, $thing2, $category3, $thing3)

check unique($thing1, $thing2, $thing3) \

and unique($category1, $category2, $category3)

assert

clues.not_related($category1, $thing1, $category3, $thing3)

##########################

# Exclusive Relationships

# Foreach A=1, assert A!2 and A!3 and A!4 and A!5

if_one_related_then_others_unrelated

foreach

clues.related($category, $thing, $category_other, $thing_other)

check unique($category, $category_other)

clues.is_category($category_other, $thing_not_other)

check unique($thing, $thing_other, $thing_not_other)

assert

clues.not_related($category, $thing, $category_other, $thing_not_other)

# Foreach A!1 and A!2 and A!3 and A!4, assert A=5

if_four_unrelated_then_other_is_related

foreach

clues.not_related($category, $thing, $category_other, $thingA)

clues.not_related($category, $thing, $category_other, $thingB)

check unique($thingA, $thingB)

clues.not_related($category, $thing, $category_other, $thingC)

check unique($thingA, $thingB, $thingC)

clues.not_related($category, $thing, $category_other, $thingD)

check unique($thingA, $thingB, $thingC, $thingD)

# Find the fifth variation of category_other.

clues.is_category($category_other, $thingE)

check unique($thingA, $thingB, $thingC, $thingD, $thingE)

assert

clues.related($category, $thing, $category_other, $thingE)

###################

# Neighbors: Basic

# Foreach "A left of 1", assert "A beside 1"

expanded_relationship_beside_left

foreach

clues.left_of($category1, $thing1, $category2, $thing2)

assert

clues.next_to($category1, $thing1, $category2, $thing2)

# Foreach "A beside 1", assert A!1

unrelated_to_beside

foreach

clues.next_to($category1, $thing1, $category2, $thing2)

check unique($category1, $category2)

assert

clues.not_related($category1, $thing1, $category2, $thing2)

###################################

# Neighbors: Spatial Relationships

# Foreach "A beside B" and "A=(at-edge)", assert "B=(near-edge)"

check_next_to_either_edge

foreach

clues.related(POSITION, $position_known, $category, $thing)

check is_edge($position_known)

clues.next_to($category, $thing, $category_other, $thing_other)

clues.is_category(POSITION, $position_other)

check is_beside($position_known, $position_other)

assert

clues.related(POSITION, $position_other, $category_other, $thing_other)

# Foreach "A beside B" and "A!(near-edge)" and "B!(near-edge)", assert "A!(at-edge)"

check_too_close_to_edge

foreach

clues.next_to($category, $thing, $category_other, $thing_other)

clues.is_category(POSITION, $position_edge)

clues.is_category(POSITION, $position_near_edge)

check is_edge($position_edge) and is_beside($position_edge, $position_near_edge)

clues.not_related(POSITION, $position_near_edge, $category, $thing)

clues.not_related(POSITION, $position_near_edge, $category_other, $thing_other)

assert

clues.not_related(POSITION, $position_edge, $category, $thing)

# Foreach "A beside B" and "A!(one-side)", assert "A=(other-side)"

check_next_to_with_other_side_impossible

foreach

clues.next_to($category, $thing, $category_other, $thing_other)

clues.related(POSITION, $position_known, $category_other, $thing_other)

check not is_edge($position_known)

clues.not_related($category, $thing, POSITION, $position_one_side)

check is_beside($position_known, $position_one_side)

clues.is_category(POSITION, $position_other_side)

check is_beside($position_known, $position_other_side) \

and unique($position_known, $position_one_side, $position_other_side)

assert

clues.related($category, $thing, POSITION, $position_other_side)

# Foreach "A left of B"...

# ... and "C=(position1)" and "D=(position2)" and "E=(position3)"

# ~> assert "A=(other-position)" and "B=(other-position)+1"

left_of_and_only_two_slots_remaining

foreach

clues.left_of($category_left, $thing_left, $category_right, $thing_right)

clues.related($category_left, $thing_left_other1, POSITION, $position1)

clues.related($category_left, $thing_left_other2, POSITION, $position2)

clues.related($category_left, $thing_left_other3, POSITION, $position3)

check unique($thing_left, $thing_left_other1, $thing_left_other2, $thing_left_other3)

clues.related($category_right, $thing_right_other1, POSITION, $position1)

clues.related($category_right, $thing_right_other2, POSITION, $position2)

clues.related($category_right, $thing_right_other3, POSITION, $position3)

check unique($thing_right, $thing_right_other1, $thing_right_other2, $thing_right_other3)

clues.is_category(POSITION, $position4)

clues.is_category(POSITION, $position5)

check is_left_right($position4, $position5) \

and unique($position1, $position2, $position3, $position4, $position5)

assert

clues.related(POSITION, $position4, $category_left, $thing_left)

clues.related(POSITION, $position5, $category_right, $thing_right)

#########################

fc_extras

def unique(*args):

return len(args) == len(set(args))

def is_edge(pos):

return (pos == 1) or (pos == 5)

def is_beside(pos1, pos2):

diff = (pos1 - pos2)

return (diff == 1) or (diff == -1)

def is_left_right(pos_left, pos_right):

return (pos_right - pos_left == 1)

driver.py(实际上更大,但这是本质)

from pyke import knowledge_engine

engine = knowledge_engine.engine(__file__)

engine.activate('relations')

try:

natl = engine.prove_1_goal('clues.related(PET, zebra, NATIONALITY, $nationality)')[0].get('nationality')

except Exception, e:

natl = "Unknown"

print "== Who owns the zebra? %s ==" % natl

样本输出:

$ python driver.py

== Who owns the zebra? German ==

# Color Nationality Pet Drink Smoke

=======================================================

1 yellow Norwegian cats water Dunhill

2 blue Dane horse tea Blend

3 red English birds milk Pall Mall

4 green German zebra coffee Prince

5 white Swede dog beer Blue Master

Calculated in 1.19 seconds.

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值