中山大學人工智能實驗6 Queries on KB

問題描述

在這裏插入圖片描述

知識庫文件

Restaurants.pl

restaurant(mixuebingcheng,1998,drinks).
restaurant(muwushaokao,2003,barbecue).
restaurant(diandude,1993,yuecai).
restaurant(ajukejiacai,2007,yuecai).
restaurant(hongmenyan,2015,yuecai).
restaurant(dagangxianmiaoshaoji,2015,yuecai).
restaurant(huangmenjimifan,1935,lucai).
restaurant(shaxianxiaochi,1998,mincai).
restaurant(tongxianghui,2013,yuecai).
restaurant(yangguofu,2007,dongbeicai).

branch(mixuebingcheng,wushan).
branch(mixuebingcheng,lujiang).
branch(mixuebingcheng,shipaixi).
branch(mixuebingcheng,yiyuannan).
branch(mixuebingcheng,beiting).
branch(mixuebingcheng,xintiandi).
branch(mixuebingcheng,beigang).
branch(mixuebingcheng,chentian).
branch(mixuebingcheng,chisha).
branch(mixuebingcheng,longdong).
branch(mixuebingcheng,zhucun).
branch(mixuebingcheng,shiqiao).

branch(muwushaokao,gangding).
branch(muwushaokao,shayuan).
branch(muwushaokao,heguang).
branch(muwushaokao,tangxia).
branch(muwushaokao,dongpu).
branch(muwushaokao,shengdi).
branch(muwushaokao,xiaogang).
branch(muwushaokao,tonghe).
branch(muwushaokao,diwangguangchang).
branch(muwushaokao,runzhengguangchang).

branch(diandude,huachengdadao).
branch(diandude,zhongshansi).
branch(diandude,huifudong).
branch(diandude,youtuobangshiguang).
branch(diandude,bainaohui).
branch(diandude,panfu).
branch(diandude,yangji).
branch(diandude,tianhebei).
branch(diandude,shiqiao).
branch(diandude,linhe).

branch(ajukejiacai,yongfu).
branch(ajukejiacai,xintiandi).
branch(ajukejiacai,shatainan).

branch(hongmenyan,xintiandi).
branch(hongmenyan,zhilanwan).

branch(dagangxianmiaoshaoji,yuancun).
branch(dagangxianmiaoshaoji,kecun).
branch(dagangxianmiaoshaoji,beishan).
branch(dagangxianmiaoshaoji,nanpudadao).
branch(dagangxianmiaoshaoji,xinshi).
branch(dagangxianmiaoshaoji,dongpu).
branch(dagangxianmiaoshaoji,huadong).
branch(dagangxianmiaoshaoji,fangcun).
branch(dagangxianmiaoshaoji,cencun).
branch(dagangxianmiaoshaoji,changxing).
branch(dagangxianmiaoshaoji,gaosheng).

branch(huangmenjimifan,siyoubei).
branch(huangmenjimifan,yuancun).
branch(huangmenjimifan,dongxiaonan).
branch(huangmenjimifan,dongxiaonan).
branch(huangmenjimifan,dongqu).
branch(huangmenjimifan,dalingang).
branch(huangmenjimifan,pazhou).
branch(huangmenjimifan,beigang).

branch(shaxianxiaochi,kangwangnan).
branch(shaxianxiaochi,beigang).
branch(shaxianxiaochi,luolang).

branch(yangguofu,xintiandi).
branch(yangguofu,dayuan).
branch(yangguofu,shishangtianhe).
branch(yangguofu,chebei).

district(wushan,tianhe).
district(shipaixi,tianhe).
district(longdong,tianhe).
district(gangding,tianhe).
district(heguang,tianhe).
district(tangxia,tianhe).
district(dongpu,tianhe).
district(huachengdadao,tianhe).
district(youtuobangshiguang,tianhe).
district(bainaohui,tianhe).
district(tianhebei,tianhe).
district(linhe,tianhe).
district(yuancun,tianhe).
district(cencun,tianhe).
district(changxing,tianhe).
district(dalingang,tianhe).
district(shishangtianhe,tianhe).
district(chebei,tianhe).


district(lujiang,haizhu).
district(yiyuannan,haizhu).
district(chisha,haizhu).
district(shayuan,haizhu).
district(xiaogang,haizhu).
district(runzhengguangchang,haizhu).
district(kecun,haizhu).
district(beishan,haizhu).
district(dongxiaonan,haizhu).
district(pazhou,haizhu).

district(beiting,panyu).
district(beigang,panyu).
district(xintiandi,panyu).
district(shiqiao,panyu).
district(zhilanwan,panyu).
district(nanpudadao,panyu).

district(chentian,baiyun).
district(shengdi,baiyun).
district(tonghe,baiyun).
district(shatainan,baiyun).
district(xinshi,baiyun).
district(dayuan,baiyun).

district(zhucun,huadu).
district(huadong,huadu).

district(diwangguangchang,yuexiu).
district(zhongshansi,yuexiu).
district(huifudong,yuexiu).
district(panfu,yuexiu).
district(yangji,yuexiu).
district(yongfu,yuexiu).
district(siyoubei,yuexiu).

district(fangcun,liwan).
district(gaosheng,liwan).
district(kangwangnan,liwan).

district(dongqu,huangpu).
district(luolang,huangpu).


branchnum(R,N):-setof(A,branch(R,A),Res),length(Res,N).
less(R1,R2):-restaurant(R1,_,_),restaurant(R2,_,_),R1\=R2,branchnum(R1,N1),branchnum(R2,N2),N1<N2.
nobranch(R):-restaurant(R,_,_),not(setof(A,branch(R,A),_)).
least(R):-setof(R1,nobranch(R1),_),nobranch(R).
least(R):-not(setof(R1,nobranch(R1),_)),restaurant(R,_,_),not(setof(R2,(less(R2,R),restaurant(R2,_,_)),_)).

numofrestaurant(A,N):-setof(R,branch(R,A),Res),length(Res,N).
morethantwo(A):-numofrestaurant(A,N),N>1.

member(H,L):-[H|_]=L.
member(X,[_|T]) :- member(X,T).

older(R1,R2):-restaurant(R1,Y1,_),restaurant(R2,Y2,_),Y1=<Y2.
oldest(R):-not(older(_,R)).

sameDistrict(R1, R2):-
branch(R1,A1),branch(R2,A2),R1\=R2,district(A1,D),district(A2,D).

查詢代碼

1.
setof(R,branch(R,beigang),Res).

2.
member(H,L):-[H|_]=L.
member(X,[_|T]) :- member(X,T).

findall(D,(restaurant(R,_,yuecai),branch(R,A),district(A,D)),Res),
setof(M,member(M,Res),Ans).

3.
nobranch(R):-restaurant(R,_,_),not(branch(R,A)).
branchnum(R,N):-setof(A,branch(R,A),Res),length(Res,N).
less(R1,R2):-restaurant(R1,_,_),restaurant(R2,_,_),R1\=R2,branchnum(R1,N1),branchnum(R2,N2),N1<N2.
least(R):-nobranch(R1),nobranch(R).
least(R):-not(nobranch(R1)),restaurant(R,_,_),not(restaurant(R2,_,_),less(R2,R)).

setof(R,least(R),Res).

4.
numofrestaurant(A,N):-setof(R,branch(R,A),Res),length(Res,N).
morethantwo(A):-numofrestaurant(A,N),N>1.

setof(A,morethantwo(A),Res).

5.
older(R1,R2):-restaurant(R1,Y1,_),restaurant(R2,Y2,_),Y1<=Y2.
setof(R,(restaurant(R2,_,_),older(R,R2)),Res),length(Res,1)

6.
findall(R,(restaurant(R,_,_),branchnum(R,N),N>9),Res).

7.
sameDistrict(R1, R2):-
branch(R1,A1),branch(R2,A2),R1\=R2,district(A1,D),district(A2,D).

setof(R,sameDistrict(huangmenjimifan,R),Res).

實驗報告

Ⅰ What restaurants have branches in beigang?
setof(R,branch(R,beigang),Res).
使用setof的技巧去重。
在這裏插入圖片描述
Ⅱ What districts have restaurants of yuecai?
member(H,L):-[H|]=L.
member(X,[
|T]) :- member(X,T).
findall(D,(restaurant(R,,yuecai),branch(R,A),district(A,D)),Res), setof(M,member(M,Res),Ans).使用傳遞的關係來表徵餐館和地區的關係,用findall輸出list類型。爲了操作list,還需要定義特殊的member關係。藉助member就可以用setof來去重。
在這裏插入圖片描述
Ⅲ What restaurants have the least number of branches?
先定義分支數關係:
branchnum(R,N):-setof(A,branch(R,A),Res),length(Res,N).
考慮到有些餐館沒有任何分支,這時使用branchnum會false。還要定義nobranch
nobranch®:-restaurant(R,
,),not(branch(R,A)).
定義小於關係:
less(R1,R2):restaurant(R1,
,),restaurant(R2,,),R1=R2,branchnum(R1,N1),branchnum(R2,N2),N1<N2.
最小關係least需要分“存在無分支的店”,和“不存在無分支的店”兩種情況。
least®:-nobranch(R1),nobranch®.
least®:not(nobranch(R1)),restaurant(R,
,),not(restaurant(R2,,),less(R2,R)).
這樣查詢就很完善。在使用not時,如果把這個關係用作第一條關係,常規的查詢可能受挫,我們有必要用一些額外的手段去初始地激勵查詢,讓查詢正常進行。
在這裏插入圖片描述
Ⅳ What areas have two or more restaurants?
同上,使用相同的方法確定數目,並用不等式作爲限制條件。
numofrestaurant(A,N):-setof(R,branch(R,A),Res),length(Res,N).
morethantwo(A):-numofrestaurant(A,N),N>1.
在這裏插入圖片描述
Ⅴ Which restaurant has the longest history?
定義older:
older(R1,R2):-restaurant(R1,Y1,
),restaurant(R2,Y2,),Y1<=Y2.
注意到最老的飯店只有它自己符合older(R,Other)。於是用下面的技巧
setof(R,(restaurant(R2,
,_),older(R,R2)),Res),length(Res,1).
在這裏插入圖片描述
Ⅵ What restaurants have at least 10 branches?
邏輯聯立:
在這裏插入圖片描述
Bonus
Please define the new relation below using Prolog and test it.
• sameDistrict(Restaurant1, Restaurant2): Restaurant1 and Restaurant2 have one or more branches in the same district.
也是邏輯聯立,記得讓R1!=R2
sameDistrict(R1, R2):-
branch(R1,A1),branch(R2,A2),R1=R2,district(A1,D),district(A2,D).
在這裏插入圖片描述

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章