實(shí) 驗(yàn) 報(bào) 告
理解謂詞邏輯知識(shí)表示的方法,掌握一階謂詞邏輯知識(shí)表示的基本原理,能夠利用歸結(jié)原理求解簡(jiǎn)單問題。掌握Prolog編程環(huán)境,熟悉邏輯推理編寫過程。
主要知識(shí)點(diǎn):謂詞、原子公式、謂詞公式、子句、子句集、空子句、歸結(jié)原理。
重點(diǎn):謂詞公式、子句集和歸結(jié)原理的實(shí)現(xiàn)。
難點(diǎn):歸結(jié)原理的實(shí)現(xiàn)。
實(shí)驗(yàn)內(nèi)容:
實(shí)驗(yàn)項(xiàng)目1:
機(jī)器人搬盒子問題:設(shè)在一個(gè)房間里,有一個(gè)機(jī)器人ROBOT ,一個(gè)壁櫥ALCOVE,一個(gè)積木塊BOX,兩個(gè)桌子A和B。開始時(shí),機(jī)器人ROBOT在壁櫥ALCOVE旁邊,且兩手空空,桌子A放著積木塊BOX,桌子B是空的。機(jī)器人可把積木塊BOX從一種狀態(tài)桌子A上變換成另一種狀態(tài)桌子B上,然后回到壁櫥。用歸結(jié)原理方法求解該問題?
?文章來源地址http://www.zghlxwxcb.cn/news/detail-717351.html
實(shí)驗(yàn)要求:
1.用謂詞公式表示問題的初始狀態(tài)、目標(biāo)狀態(tài)以及機(jī)器人操作;
2.將謂詞公式轉(zhuǎn)換為子句集;
3. 利用歸結(jié)原理對(duì)子句集中的子句進(jìn)行歸結(jié)。
4. 用Prolog實(shí)現(xiàn)機(jī)器人搬盒子的謂詞邏輯。
5. 用Python或其他編程語言實(shí)現(xiàn)該問題的求解。
?
實(shí)驗(yàn)項(xiàng)目2:
?????? 愛因斯坦邏輯難題(斑馬問題):5個(gè)不同國(guó)家且工作各不相同的人分別住在一條街上的5所房子里,每所房子的顏色不同,每個(gè)人都有自己養(yǎng)的不同寵物,喜歡喝不同的飲料。根據(jù)以下信息,你能告訴我哪所房子里的人養(yǎng)斑馬,哪所房子里的人喜歡喝礦泉水嗎?
1.???? 英國(guó)人住在紅色的房子里
2.???? 西班牙人養(yǎng)了一條狗
3.???? 日本人是一個(gè)油漆工
4.???? 意大利人喜歡喝茶
5.???? 挪威人住在左邊的第一個(gè)房子里
6.???? 綠房子在白房子的右邊
7.???? 攝影師養(yǎng)了一只蝸牛
8.???? 外交官住在黃房子里
9.???? ?????????????
?
實(shí)驗(yàn)要求:
1. 用Prolog實(shí)現(xiàn)斑馬問題的邏輯推理。
2. 在華為云的ModelArts中用Python實(shí)現(xiàn)該問題的求解。
?
思考題:
- 如何將謂詞公式轉(zhuǎn)換為子句集?
1)消去蘊(yùn)含等價(jià)式
2)移動(dòng)否定符號(hào)
3)變量標(biāo)準(zhǔn)化
4)消去存在量詞
5)化為前束型
6)化為skolem標(biāo)準(zhǔn)型
7)略去全稱量詞
8)消去合取詞,把母式用子句集表示
9)字句變量標(biāo)準(zhǔn)化
2. 謂詞公式與子句集等值嗎?
1)謂語公式與它的子句集不是總等價(jià)的。
2)在謂語公式不可滿足的情況下是等價(jià)的。
實(shí)驗(yàn)步驟:
(一):項(xiàng)目一:
?
?
?
4. 用Prolog實(shí)現(xiàn)機(jī)器人搬盒子的謂詞邏輯。
- table(a).??
- table(b).??
- empty(robot).??
- at(robot,c).??
- on(box,a).??
- goto(robort,a):-at(robot,c).??
- ??
- at(robot,a).??
- pick(a):-empty(robot),on(box,a),table(a).??
- ??
- on(box,robot).??
- empty(a).??
- goto(robot,b):--at(robot,a).??
- ??
- at(robot,b).??
- set_down(b):-at(robot,b),on(box,robot),table(b).??
- ??
- empty(robot).??
- on(box,b).??
- at(robot,b).??
- goto(robot,c):-at(robot,b),on(box,b).??
- ??
- at(robot,c).??
- empty(robot).??
- on(box,b).??
- finish(box):-on(box,b),at(robot,c),empty(robot).??
- ?
- Student(李云霄,202131090218)
?
5. 用Python或其他編程語言實(shí)現(xiàn)該問題的求解。
- #定義三個(gè)變量(robot_site,is_robot_box,box_site),表示當(dāng)前狀態(tài).??
- #系統(tǒng)狀態(tài)??
- state=['robot_site','is_robot_box','box_site']??
- num=0??
- state_num=[state,num]??
- #初始狀態(tài)??
- def?initial_state(state):??
- ???robot_site='c'??
- ???global?num??
- ???is_robot_box='no'??
- ???box_site='a'??
- ???state=[robot_site,is_robot_box,box_site]??
- ???print("狀態(tài):%d?機(jī)器人當(dāng)前位置:%c?機(jī)器人是否拿著箱子:%s?箱子所在位置:%s"%(num,state[0],state[1],state[2]))??
- ???num+=1??
- ???return?state??
- #目標(biāo)狀態(tài)??
- def?target_state(state):??
- ???global?num??
- ???robot_site='c'??
- ???is_robot_box='no'??
- ???box_site='b'??
- ???state=[robot_site,is_robot_box,box_site]??
- ???return?state??
- #機(jī)器人移動(dòng)??
- def?robot_move(state,robot_object_site):??
- ???global?num??
- ???temp_robot_site=state[0]??
- ???state[0]=robot_object_site??
- ???print("狀態(tài):%d?機(jī)器人從%s移動(dòng)到了%s"%(num,temp_robot_site,state[0]))??
- ???num+=1??
- ???return?state??
- #機(jī)器人搬起箱子??
- def?pick_up_box(state,is_robot_box,box_site):??
- ???global?num??
- ???state[1]=is_robot_box??
- ???state[2]=box_site??
- ???if(state[1]=='yes'):??
- ??????print('狀態(tài):%d?機(jī)器人拿起了箱子'%num)??
- ???num+=1??
- ???return?state??
- #機(jī)器人放下箱子??
- def?set_down_box(state,is_robot_box,box_site):??
- ???global?num??
- ???state[1]=is_robot_box??
- ???state[2]=box_site??
- ???if(state[1]=='no'):??
- ??????print('狀態(tài):%d?機(jī)器人把箱子放在了%c'%(num,state[2]))??
- ???num+=1??
- ???return?state??
- #判斷機(jī)器人是否完成任務(wù)??
- def?judge_obj(state):??
- ???state0=target_state(state)??
- ???if(state[0]==state0[0]?and?state[1]==state0[1]?and?state[2]==state0[2]):??
- ??????print('機(jī)器人完成任務(wù).\n')??
- #作業(yè)完成人??
- def?liyunxiao():??
- ???print('學(xué)號(hào):202131090218')??
- ???print('姓名:')??
- #主程序??
- state=['robot_site','is_robot_box','box_site']??
- num=1??
- robot_object_site='a'??
- box_site='robot'??
- is_robot_box='yes'??
- state=initial_state(state)#狀態(tài)1??
- state=robot_move(state,robot_object_site)#狀態(tài)2??
- box_site='robot'??
- is_robot_box='yes'??
- state=pick_up_box(state,is_robot_box,box_site)#狀態(tài)3??
- robot_object_site='b'??
- state=robot_move(state,robot_object_site)#狀態(tài)4??
- box_site='b'??
- is_robot_box='no'??
- state=set_down_box(state,is_robot_box,box_site)??
- robot_object_site='c'??
- state=robot_move(state,robot_object_site)??
- judge_obj(state)??
- liyunxiao()??
結(jié)果:
狀態(tài):1 |
機(jī)器人當(dāng)前位置:c 機(jī)器人是否拿著箱子:no 箱子所在位置:a |
狀態(tài):2 |
機(jī)器人從c移動(dòng)到了a |
狀態(tài):3 |
機(jī)器人拿起了箱子 |
狀態(tài):4 |
機(jī)器人從a移動(dòng)到了b |
狀態(tài):5 |
機(jī)器人把箱子放在了b |
狀態(tài):6 |
機(jī)器人從b移動(dòng)到了c |
?
(二)項(xiàng)目二
1. 用Prolog實(shí)現(xiàn)斑馬問題的邏輯推理。
- /*描述房子的事實(shí):建立五個(gè)房間*/??
- house(A,[A,_,_,_,_]).??
- house(A,[_,A,_,_,_]).???
- house(A,[_,_,A,_,_]).???
- house(A,[_,_,_,A,_]).???
- house(A,[_,_,_,_,A]).???
- /*描述房子的事實(shí):建立房間之間的位置關(guān)系(left)*/??
- left(A,B,[A,B,_,_,_]).???
- left(A,B,[_,A,B,_,_]).???
- left(A,B,[_,_,A,B,_]).???
- left(A,B,[_,_,_,A,B]).???
- /*描述房子的事實(shí):標(biāo)記中間的房間(middle)*/??
- middle(A,[_,_,A,_,_]).???
- /*描述房子的事實(shí):標(biāo)記第一個(gè)房間(first)*/??
- first(A,[A,_,_,_,_]).???
- /*描述房子的事實(shí):建立房間之間的鄰居關(guān)系(neighbor)*/??
- neighbor(A,B,[A,B,_,_,_]).???
- neighbor(A,B,[_,A,B,_,_]).???
- neighbor(A,B,[_,_,A,B,_]).???
- neighbor(A,B,[_,_,_,A,B]).???
- neighbor(A,B,[B,A,_,_,_]).???
- neighbor(A,B,[_,B,A,_,_]).???
- neighbor(A,B,[_,_,B,A,_]).???
- neighbor(A,B,[_,_,_,B,A]).???
- /*建立人的五個(gè)屬性*/??
- people[Country,Pet,Color,Drink,Smoke].???
- /*根據(jù)題目所給的信息描述房間分配的規(guī)則*/??
- find(Houses)?:-???
- house(people(britsh,_,red,_,_),?Houses),???
- house(people(spain,dog,_,_,_),?Houses),???
- house(people(japan,_,_,_,congressCigarettes),?Houses),???
- house(people(ukraine,_,_,tea,_),?Houses),?house(people(norway,_,_,_,_),?Houses),???
- first(people(norway,_,_,_,_),?Houses),???
- left(people(_,_,green,_,_),?people(_,_,white,_,_),?Houses),???
- house(people(_,snail,_,_,winstonCigarettes),?Houses),???
- house(people(_,_,yellow,_,coorsCigarettes),?Houses),???
- middle(people(_,_,_,milk,_),?Houses),???
- house(people(_,_,green,cafe,_),?Houses),???
- neighbor(people(norway,_,_,_,_),?people(_,_,blue,_,_),?Houses),???
- house(people(_,_,_,orange,luckCigarattes),?Houses),???
- neighbor(people(_,fox,_,_,_),?people(_,_,_,_,chesfieldCigarettes),?Houses),???
- neighbor(people(_,horse,_,_,_),?people(_,_,_,_,coorsCigarettes),?Houses),???
- house(people(_,zebra,_,_,_),?Houses),???
- house(people(_,_,_,water,_),?Houses).???
?
2. 在華為云的ModelArts中用Python實(shí)現(xiàn)該問題的求解。
平臺(tái)展示:
https://authoring-modelarts-cnnorth4.huaweicloud.com/c4f2050c-0934-4284-8c16-dab71aded289/lab
?
?
源代碼:
- from?kanren?import?*???????????????
- from?kanren.core?import?lall?????#?lall?包用于定義規(guī)則??
- import?time??
- #定義?left()函數(shù),用來查找哪個(gè)房屋左邊??
- def?left(q,?p,?list):??
- ?????return?membero((q,p),?zip(list,?list[1:]))??
- #定義?next()函數(shù),用來接近誰的房子??
- def?next(q,?p,?list):??
- ????return?conde([left(q,?p,?list)],?[left(p,?q,?list)])??
- from?kanren?import?*??
- from?kanren.core?import?lall?????#?lall?包用于定義規(guī)則??
- import?time??
- ??
- #定義?left()函數(shù),用來查找哪個(gè)房屋左邊??
- def?left(q,?p,?list):??
- ?????return?membero((q,p),?zip(list,?list[1:]))??
- #定義?next()函數(shù),用來接近誰的房子??
- def?next(q,?p,?list):??
- ????return?conde([left(q,?p,?list)],?[left(p,?q,?list)])??
- ??
- houses?=?var()??
- rules_zebraproblem?=?lall(??
- ?????(eq,?(var(),?var(),?var(),?var(),?var()),?houses),???????#?5?個(gè)?var()分別代表人、煙、飲料、動(dòng)物、屋子顏色??
- ??????#?房子里的每個(gè)子成員有五個(gè)屬性:?membero(國(guó)家,身份,飲料,寵物,房子)??
- ?????(membero,('英國(guó)人',?var(),?var(),?var(),?'紅色'),?houses),??????????#?1.?英國(guó)人住在紅色的房子里??
- ?????(membero,('西班牙人',?var(),?var(),?'狗',?var()),?houses),??????????#?2.?西班牙人養(yǎng)了一條狗??
- ?????????(membero,('日本人',?'油漆工',?var(),?var(),?var()),?houses),????????#?3.?日本人是一個(gè)油漆工??
- ?????????(membero,('意大利人',?var(),?'茶',?var(),?var()),?houses),??????????#?4.?意大利人喜歡喝茶??
- ????????#?5.?挪威人住在左邊的第一個(gè)房子里??
- ?????????(eq,(('挪威人',?var(),?var(),?var(),?var()),?var(),?var(),?var(),?var()),?houses),??
- ?????????(left,(var(),?var(),?var(),?var(),?'白色'),(var(),?var(),?var(),?var(),?'綠色'),?houses),????#?6.?綠房子在白房子的右邊??
- ?????????(membero,(var(),?'攝影師',?var(),?'蝸牛',?var()),?houses),?????????????????????#?7.?攝影師養(yǎng)了一只蝸牛??
- ?????????(membero,(var(),?'外交官',?var(),?var(),?'黃色'),?houses),?????????????????????#?8.?外交官住在黃房子里??
- ?????????(eq,(var(),?var(),?(var(),?var(),?'牛奶',?var(),?var()),?var(),?var()),?houses),??????#?9.?中間那個(gè)房子的人喜歡喝牛奶??
- ?????????(membero,(var(),?var(),?'咖啡',?var(),?'綠色'),?houses),??????????????????#?10.?喜歡喝咖啡的人住在綠房子里??
- ????????#?11.?挪威人住在藍(lán)色的房子旁邊??
- ?????????(next,('挪威人',?var(),?var(),?var(),?var()),(var(),?var(),?var(),?var(),?'藍(lán)色'),?houses),??
- ?????????(membero,(var(),?'小提琴家',?'橘子汁',?var(),?var()),?houses),???????????????#?12.?小提琴家喜歡喝橘子汁??
- ????????#?13.?養(yǎng)狐貍的人所住的房子與醫(yī)生的房子相鄰??
- ????????(next,(var(),?var(),?var(),?'狐貍',?var()),(var(),?'醫(yī)生',?var(),?var(),?var()),?houses),??
- ????????#?14.?養(yǎng)馬的人所住的房子與外交官的房子相鄰??
- ?????????(next,(var(),?var(),?var(),?'馬',?var()),(var(),?'外交官',?var(),?var(),?var()),?houses),??
- ????????(membero,(var(),?var(),?var(),?'斑馬',?var()),?houses),??????????????????#?問題?1.?有人養(yǎng)斑馬??
- ?????????(membero,(var(),?var(),?'礦泉水',?var(),?var()),?houses),???????????????????#?問題?2.?有人喜歡喝礦泉水??
- ????)??
- ??
- #?使用?rules_zebraproblem?約束運(yùn)行解算器??
- solutions?=?run(0,?houses,?rules_zebraproblem)??
- #?提取解算器的輸出??
- output?=?[house?for?house?in?solutions[0]?if?'斑馬'?in?house][0][4]??
- print?('\n{}房子里的人養(yǎng)斑馬'.format(output))??
- output?=?[house?for?house?in?solutions[0]?if?'礦泉水'?in?house][0][4]??
- print?('\n{}房子里的人喜歡喝礦泉水\n'.format(output))??
- ??
- #?解算器的輸出結(jié)果展示??
- print("所有結(jié)果如下:")??
- for?i?in?solutions[0]:??
- ????print(i)??
- Print(“swpu,202131090218”)
- ?
結(jié)果:
挪威人 |
外交官 |
礦泉水 |
狐貍 |
黃色 |
意大利人 |
醫(yī)生 |
茶 |
馬 |
藍(lán)色 |
英國(guó)人 |
攝影師 |
牛奶 |
蝸牛 |
紅色 |
西班牙人 |
小提琴家 |
橘子汁 |
狗 |
白色 |
日本人 |
油漆工 |
咖啡 |
斑馬' |
綠色 |
?
實(shí)驗(yàn)總結(jié)
在本次實(shí)驗(yàn)中,運(yùn)用prolog代碼可以幫助我們解決生活中一些實(shí)在的邏輯問題,在完成實(shí)驗(yàn)的過程中,學(xué)習(xí)如何運(yùn)用prolog,python以及這些編程語言的邏輯函數(shù)庫kanren,可以幫助我們解決很多實(shí)際問題,在培養(yǎng)邏輯編程,解決邏輯問題方面有很大的提升,也是對(duì)自己編程能力和解決問題能力的一種提升。在本次實(shí)驗(yàn)中,我們學(xué)習(xí)和實(shí)踐了兩個(gè)經(jīng)典的人工智能案例:機(jī)器人搬箱子問題和愛因斯坦邏輯難題(斑馬問題)。這兩個(gè)實(shí)驗(yàn)涉及到搜索算法、專家系統(tǒng)等多種人工智能技術(shù),以及相關(guān)編程語言和框架的使用。對(duì)于機(jī)器人搬箱子問題,我們首先用謂詞公式表示問題的初始狀態(tài)、目標(biāo)狀態(tài)以及機(jī)器人操作,然后將其轉(zhuǎn)換為子句集,并利用歸結(jié)原理對(duì)子句集進(jìn)行歸結(jié)。我們還用 Prolog 實(shí)現(xiàn)機(jī)器人搬箱子的謂詞邏輯,并用 Python 或其他編程語言實(shí)現(xiàn)了該問題的求解。通過這個(gè)實(shí)驗(yàn),我們深入研究了搜索算法和蟻群算法的原理和應(yīng)用,對(duì)基于規(guī)則的機(jī)器人行走路徑規(guī)劃模型有了更深入的理解。在斑馬問題實(shí)驗(yàn)中,我們使用 Prolog 實(shí)現(xiàn)了邏輯推理,也在華為云的 ModelArts 中用 Python 實(shí)現(xiàn)了該問題的求解。為我們提供了一個(gè)綜合性的應(yīng)用案例,在實(shí)驗(yàn)過程中,我們還掌握了謂詞邏輯的基本概念、知識(shí)表示與推理、歸結(jié)原理等重要技術(shù)。通過兩個(gè)實(shí)驗(yàn)項(xiàng)目的學(xué)習(xí)和實(shí)踐,我們對(duì)人工智能算法和技術(shù)有了更深入的認(rèn)識(shí),同時(shí)也培養(yǎng)了團(tuán)隊(duì)協(xié)作和問題解決能力。這次實(shí)驗(yàn)的成功也為我們今后更深入地學(xué)習(xí)和應(yīng)用人工智能提供了堅(jiān)實(shí)的基礎(chǔ)和經(jīng)驗(yàn)。文章來源:http://www.zghlxwxcb.cn/news/detail-717351.html
?
到了這里,關(guān)于人工智能導(dǎo)論第一次實(shí)驗(yàn)——機(jī)器人搬箱子,斑馬問題的文章就介紹完了。如果您還想了解更多內(nèi)容,請(qǐng)?jiān)谟疑辖撬阉鱐OY模板網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章,希望大家以后多多支持TOY模板網(wǎng)!