W3Cschool
恭喜您成為首批注冊(cè)用戶
獲得88經(jīng)驗(yàn)值獎(jiǎng)勵(lì)
邏輯編程可用于解決許多問題,如8拼圖,斑馬拼圖,數(shù)獨(dú),N皇后等。在這里,舉例說明斑馬拼圖的變體如下 -
有五間房子。
英國人住在紅房子里。
瑞典人有一只狗。
丹麥人喝茶。
綠房子在白房子的左邊。
他們?cè)诰G房子里喝咖啡。
吸Pall Mall的人有鳥。
吸Dunhill在的人黃色房子里。
在中間的房子里,他們喝牛奶。
挪威人住在第一宮。
那個(gè)抽Blend的男人住在貓屋旁邊的房子里。
在他們有一匹馬的房子旁邊的房子里,他們吸Dunhill煙。
抽Blue Master的人喝啤酒。
德國人吸Prince煙。
挪威人住在藍(lán)房子旁邊。
他們?cè)诜孔优赃叺姆孔永锖人谀抢镂?Blend 煙。
在 Python 的幫助下解決誰有斑馬的問題。 導(dǎo)入必要的軟件包 -
from kanren import *
from kanren.core import lall
import time
現(xiàn)在,我們需要定義兩個(gè)函數(shù) - left()
和 next()
來查找哪個(gè)房屋左邊或接近誰的房子 -
def left(q, p, list):
return membero((q,p), zip(list, list[1:]))
def next(q, p, list):
return conde([left(q, p, list)], [left(p, q, list)])
現(xiàn)在,聲明一個(gè)變量:houses
,如下 -
houses = var()
需要在 lall
包的幫助下定義規(guī)則如下。
有5
間房子 -
rules_zebraproblem = lall(
(eq, (var(), var(), var(), var(), var()), houses),
(membero,('Englishman', var(), var(), var(), 'red'), houses),
(membero,('Swede', var(), var(), 'dog', var()), houses),
(membero,('Dane', var(), 'tea', var(), var()), houses),
(left,(var(), var(), var(), var(), 'green'),
(var(), var(), var(), var(), 'white'), houses),
(membero,(var(), var(), 'coffee', var(), 'green'), houses),
(membero,(var(), 'Pall Mall', var(), 'birds', var()), houses),
(membero,(var(), 'Dunhill', var(), var(), 'yellow'), houses),
(eq,(var(), var(), (var(), var(), 'milk', var(), var()), var(), var()), houses),
(eq,(('Norwegian', var(), var(), var(), var()), var(), var(), var(), var()), houses),
(next,(var(), 'Blend', var(), var(), var()),
(var(), var(), var(), 'cats', var()), houses),
(next,(var(), 'Dunhill', var(), var(), var()),
(var(), var(), var(), 'horse', var()), houses),
(membero,(var(), 'Blue Master', 'beer', var(), var()), houses),
(membero,('German', 'Prince', var(), var(), var()), houses),
(next,('Norwegian', var(), var(), var(), var()),
(var(), var(), var(), var(), 'blue'), houses),
(next,(var(), 'Blend', var(), var(), var()),
(var(), var(), 'water', var(), var()), houses),
(membero,(var(), var(), var(), 'zebra', var()), houses)
)
現(xiàn)在,用前面的約束運(yùn)行解算器 -
solutions = run(0, houses, rules_zebraproblem)
借助以下代碼,可以提取解算器的輸出 -
output_zebra = [house for house in solutions[0] if 'zebra' in house][0][0]
以下代碼將打印解決方案 -
print ('\n'+ output_zebra + 'owns zebra.')
上述代碼的輸出如下 -
German owns zebra.
Copyright©2021 w3cschool編程獅|閩ICP備15016281號(hào)-3|閩公網(wǎng)安備35020302033924號(hào)
違法和不良信息舉報(bào)電話:173-0602-2364|舉報(bào)郵箱:jubao@eeedong.com
掃描二維碼
下載編程獅App
編程獅公眾號(hào)
聯(lián)系方式:
更多建議: