问题描述
知识库文件
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).