中山大学人工智能实验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).
在这里插入图片描述

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