AI人工智能 解決難題

2020-09-24 14:02 更新

邏輯編程可用于解決許多問題,如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.
以上內(nèi)容是否對(duì)您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號(hào)
微信公眾號(hào)

編程獅公眾號(hào)