/* 看了几天 PROLOG, 写一个实例.用SWI 写的.*/
/* 一些子函数*/
member(A,[A|_]).
member(A,[_|B]):- member(A,B).
subs([],_).
subs([H|A],B):- member(H,B),subs(A,B).
sames(A,B):- subs(A,B),subs(B,A).
/* 两个集合,互为子集合,则相等.用于 穷举固定 子元素,但不固定 子元素顺序的 该集合的不同形式.*/
/*定义隔壁,就是两个房间的号码相连*/
gebi(A,B):- B is A-1.
gebi(A,B):- B is A+1.
/*分析 :
1, 房间用房号 1-5来表示,1到5是从左到右,
由于没有说明 第一间是从左数,还是从右数,所以挪威人可能是1号房,也可能是5号房.
2,由于懒,国家名不想去查了,就用拼音代替了.
3, 没什么好说的了.*/
/* 解法1 */
za(XX):-
Colors = [red,green,white,yellow,blue],
Cons = [english,danmai,nuowei,deguo,ruidian],
Drinks = [beer,coffee,milk,tea,water],
Smokes = [pallmall,dunhill,blends,bluemaster,prince],
Pets = [bird,fish,cat,horse,dog],
sames(Cons,[CON1,CON2,CON3,CON4,CON5]),CON3\=danmai,
member(nuowei,[CON1,CON5]),
sames(Colors,[CL1,CL2,CL3,CL4,CL5]),CL3\=green,
member([blue,nuowei],[[CL2,CON1],[CL4,CON5]]),
member([red,english],[[CL1,CON1],[CL2,CON2],[CL3,CON3],[CL4,CON4],[CL5,CON5]]),
sames(Drinks,[DR1,DR2,milk,DR4,DR5]),
member([danmai,tea],[[CON1,DR1],[CON2,DR2],[CON4,DR4],[CON5,DR5]]),
member([green,coffee],[[CL1,DR1],[CL2,DR2],[CL4,DR4],[CL5,DR5]]),
sames(Smokes,[SM1,SM2,SM3,SM4,SM5]),SM3\=bluemaster,
member([yellow,dunhill],[[CL1,SM1],[CL2,SM2],[CL3,SM3],[CL4,SM4],[CL5,SM5]]),
member([beer,bluemaster],[[DR1,SM1],[DR2,SM2],[DR4,SM4],[DR5,SM5]]),
member([deguo,prince],[[CON1,SM1],[CON2,SM2],[CON3,SM3],[CON4,SM4],[CON5,SM5]]),
sames(Pets,[PET1,PET2,PET3,PET4,PET5]),
member([ruidian,dog],[[CON1,PET1],[CON2,PET2],[CON3,PET3],[CON4,PET4],[CON5,PET5]]),
member([pallmall,bird],[[SM1,PET1],[SM2,PET2],[SM3,PET3],[SM4,PET4],[SM5,PET5]]),
Z1=[1,CL1,CON1,DR1,SM1,PET1],
Z2=[2,CL2,CON2,DR2,SM2,PET2],
Z3=[3,CL3,CON3,milk,SM3,PET3],
Z4=[4,CL4,CON4,DR4,SM4,PET4],
Z5=[5,CL5,CON5,DR5,SM5,PET5],
Z=[Z1,Z2,Z3,Z4,Z5],
member([HBLUE,blue,_,_,_,_],Z),
member([HNW,_,nuowei,_,_,_],Z),
gebi(HNW,HBLUE),
member([HG,green,_,_,_,_],Z),
member([HW,white,_,_,_,_],Z),
HG<HW,
member([HB,_,_,_,blends,_],Z),
member([HCAT,_,_,_,_,cat],Z),
gebi(HB,HCAT),
member([HWater,_,_,water,_,_],Z),
gebi(HWater,HB),
member([HHORSE,_,_,_,_,horse],Z),
member([HDUN,yellow,_,_,_,_],Z),
gebi(HDUN,HHORSE),
member(XX,Z),
member(fish,XX).
/*解法2*/
za2(XX):-
Colors = [red,green,white,yellow,blue],
/* Cons = [english,danmai,nuowei,deguo,ruidian],*/ /* 国家其实没有必要定义 */
Drinks = [beer,coffee,milk,tea,water],
Smokes = [pallmall,dunhill,blends,bluemaster,prince],
Pets = [bird,fish,cat,horse,dog],
member(H5,[1,5]),/*9*/
sames([1,2,3,4,5],[H1,H2,H3,H4,H5]),
sames(Drinks,[DR1,DR2,tea,DR4,DR5]),
member([3,milk], [[H1,DR1], [H2,DR2], [H4,DR4], [H5,DR5]]), /*8*/
sames(Colors,[red,CL2,CL3,CL4,CL5]),
member([green,coffee], [[CL2,DR2],[CL4,DR4],[CL5,DR5]]),/*5*/
sames(Smokes,[SM1,prince,SM3,SM4,SM5]),
member([yellow,dunhill], [[CL3,SM3],[CL4,SM4],[CL5,SM5]]),/*7*/
member([beer,bluemaster],[[DR1,SM1],[DR4,SM4],[DR5,SM5]]),/*12*/
sames(Pets,[PT1,PT2,PT3,dog,PT5]),
member([pallmall,bird], [[SM1,PT1],[SM3,PT3],[SM5,PT5]]),/*6*/
Z1=[H1,red,english,DR1,SM1,PT1],
Z2=[H2,CL2,deguo,DR2,prince,PT2],
Z3=[H3,CL3,danmai,tea,SM3,PT3],
Z4=[H4,CL4,ruidian,DR4,SM4,dog],
Z5=[H5,CL5,nuowei,DR5,SM5,PT5],
Z=[Z1,Z2,Z3,Z4,Z5],
member([XG1,blue,_,_,_,_],Z),gebi(XG1,H5), /*14*/
member([XC2,yellow,_,_,_,_],Z), /*11*/
member([XA2,green,_,_,_,_],Z),
member([XF1,white,_,_,_,_],Z),XA2<XF1, /*4*/
member([XI1,_,_,water,_,_],Z),
member([XH1,_,_,_,blends,_],Z),gebi(XH1,XI1), /*15*/
member([XJ1,_,_,_,_,cat],Z),gebi(XH1,XJ1), /*10*/
member([XK1,_,_,_,_,horse],Z),gebi(XK1,XC2), /*11*/
member(XX,Z),
member(fish,XX).
/* 两个程序都在
http://swish.swi-prolog.org/ 上试验通过.时间小于0.3秒 */