prolog(大坑(三基友(1))).
某日遇到一个逻辑测试题,大意如下:三个人来自辽宁,湖南,重庆,其中李浩与重庆人不同岁,张翔比辽宁人小,重庆人比王明大。求三个人分别来自哪里,及年龄排序。
人肉解法很简单,重庆人既不是李浩也不是王明,所以重庆人是张翔;
王明小于(张翔,重庆),(张翔,重庆)小于辽宁人,所以王明是湖南人,且年龄最小;
最后推出李浩是辽宁人,年龄最大。
据说prolog可以轻松解出这种条件约束的问题,包括比这个更复杂的谁养斑马的问题,于是赶紧下书来读,下面是惨不忍睹的坎坷道路。
bigger(大,小).这个谓词不会编,所以只能先列出全排列,然后再从中做出筛选。
全排列代码如下:
name(lihao).
name(wangming).
name(zhangxiang).
from(liaoning).
from(hunan).
from(chongqing).
pailie(List):-
List=(p(N1,F1),p(N2,F2),p(N3,F3)),
name(N1),name(N2),name(N3),
not(N1=N2;N2=N3;N1=N3),
from(F1),from(F2),from(F3),
not(F1=F2;F2=F3;F1=F3),
write(List),nl,fail.
**************************************
运行?-pailie(List). 结果如下:
p(lihao,liaoning),p(wangming,hunan),p(zhangxiang,chongqing)
p(lihao,liaoning),p(wangming,chongqing),p(zhangxiang,hunan)
p(lihao,hunan),p(wangming,liaoning),p(zhangxiang,chongqing)
p(lihao,hunan),p(wangming,chongqing),p(zhangxiang,liaoning)
p(lihao,chongqing),p(wangming,liaoning),p(zhangxiang,hunan)
p(lihao,chongqing),p(wangming,hunan),p(zhangxiang,liaoning)
p(lihao,liaoning),p(zhangxiang,hunan),p(wangming,chongqing)
p(lihao,liaoning),p(zhangxiang,chongqing),p(wangming,hunan)
p(lihao,hunan),p(zhangxiang,liaoning),p(wangming,chongqing)
p(lihao,hunan),p(zhangxiang,chongqing),p(wangming,liaoning)
p(lihao,chongqing),p(zhangxiang,liaoning),p(wangming,hunan)
p(lihao,chongqing),p(zhangxiang,hunan),p(wangming,liaoning)
p(wangming,liaoning),p(lihao,hunan),p(zhangxiang,chongqing)
p(wangming,liaoning),p(lihao,chongqing),p(zhangxiang,hunan)
p(wangming,hunan),p(lihao,liaoning),p(zhangxiang,chongqing)
p(wangming,hunan),p(lihao,chongqing),p(zhangxiang,liaoning)
p(wangming,chongqing),p(lihao,liaoning),p(zhangxiang,hunan)
p(wangming,chongqing),p(lihao,hunan),p(zhangxiang,liaoning)
p(wangming,liaoning),p(zhangxiang,hunan),p(lihao,chongqing)
p(wangming,liaoning),p(zhangxiang,chongqing),p(lihao,hunan)
p(wangming,hunan),p(zhangxiang,liaoning),p(lihao,chongqing)
p(wangming,hunan),p(zhangxiang,chongqing),p(lihao,liaoning)
p(wangming,chongqing),p(zhangxiang,liaoning),p(lihao,hunan)
p(wangming,chongqing),p(zhangxiang,hunan),p(lihao,liaoning)
p(zhangxiang,liaoning),p(lihao,hunan),p(wangming,chongqing)
p(zhangxiang,liaoning),p(lihao,chongqing),p(wangming,hunan)
p(zhangxiang,hunan),p(lihao,liaoning),p(wangming,chongqing)
p(zhangxiang,hunan),p(lihao,chongqing),p(wangming,liaoning)
p(zhangxiang,chongqing),p(lihao,liaoning),p(wangming,hunan)
p(zhangxiang,chongqing),p(lihao,hunan),p(wangming,liaoning)
p(zhangxiang,liaoning),p(wangming,hunan),p(lihao,chongqing)
p(zhangxiang,liaoning),p(wangming,chongqing),p(lihao,hunan)
p(zhangxiang,hunan),p(wangming,liaoning),p(lihao,chongqing)
p(zhangxiang,hunan),p(wangming,chongqing),p(lihao,liaoning)
p(zhangxiang,chongqing),p(wangming,liaoning),p(lihao,hunan)
p(zhangxiang,chongqing),p(wangming,hunan),p(lihao,liaoning)
false.
某日遇到一个逻辑测试题,大意如下:三个人来自辽宁,湖南,重庆,其中李浩与重庆人不同岁,张翔比辽宁人小,重庆人比王明大。求三个人分别来自哪里,及年龄排序。
人肉解法很简单,重庆人既不是李浩也不是王明,所以重庆人是张翔;
王明小于(张翔,重庆),(张翔,重庆)小于辽宁人,所以王明是湖南人,且年龄最小;
最后推出李浩是辽宁人,年龄最大。
据说prolog可以轻松解出这种条件约束的问题,包括比这个更复杂的谁养斑马的问题,于是赶紧下书来读,下面是惨不忍睹的坎坷道路。
bigger(大,小).这个谓词不会编,所以只能先列出全排列,然后再从中做出筛选。
全排列代码如下:
name(lihao).
name(wangming).
name(zhangxiang).
from(liaoning).
from(hunan).
from(chongqing).
pailie(List):-
List=(p(N1,F1),p(N2,F2),p(N3,F3)),
name(N1),name(N2),name(N3),
not(N1=N2;N2=N3;N1=N3),
from(F1),from(F2),from(F3),
not(F1=F2;F2=F3;F1=F3),
write(List),nl,fail.
**************************************
运行?-pailie(List). 结果如下:
p(lihao,liaoning),p(wangming,hunan),p(zhangxiang,chongqing)
p(lihao,liaoning),p(wangming,chongqing),p(zhangxiang,hunan)
p(lihao,hunan),p(wangming,liaoning),p(zhangxiang,chongqing)
p(lihao,hunan),p(wangming,chongqing),p(zhangxiang,liaoning)
p(lihao,chongqing),p(wangming,liaoning),p(zhangxiang,hunan)
p(lihao,chongqing),p(wangming,hunan),p(zhangxiang,liaoning)
p(lihao,liaoning),p(zhangxiang,hunan),p(wangming,chongqing)
p(lihao,liaoning),p(zhangxiang,chongqing),p(wangming,hunan)
p(lihao,hunan),p(zhangxiang,liaoning),p(wangming,chongqing)
p(lihao,hunan),p(zhangxiang,chongqing),p(wangming,liaoning)
p(lihao,chongqing),p(zhangxiang,liaoning),p(wangming,hunan)
p(lihao,chongqing),p(zhangxiang,hunan),p(wangming,liaoning)
p(wangming,liaoning),p(lihao,hunan),p(zhangxiang,chongqing)
p(wangming,liaoning),p(lihao,chongqing),p(zhangxiang,hunan)
p(wangming,hunan),p(lihao,liaoning),p(zhangxiang,chongqing)
p(wangming,hunan),p(lihao,chongqing),p(zhangxiang,liaoning)
p(wangming,chongqing),p(lihao,liaoning),p(zhangxiang,hunan)
p(wangming,chongqing),p(lihao,hunan),p(zhangxiang,liaoning)
p(wangming,liaoning),p(zhangxiang,hunan),p(lihao,chongqing)
p(wangming,liaoning),p(zhangxiang,chongqing),p(lihao,hunan)
p(wangming,hunan),p(zhangxiang,liaoning),p(lihao,chongqing)
p(wangming,hunan),p(zhangxiang,chongqing),p(lihao,liaoning)
p(wangming,chongqing),p(zhangxiang,liaoning),p(lihao,hunan)
p(wangming,chongqing),p(zhangxiang,hunan),p(lihao,liaoning)
p(zhangxiang,liaoning),p(lihao,hunan),p(wangming,chongqing)
p(zhangxiang,liaoning),p(lihao,chongqing),p(wangming,hunan)
p(zhangxiang,hunan),p(lihao,liaoning),p(wangming,chongqing)
p(zhangxiang,hunan),p(lihao,chongqing),p(wangming,liaoning)
p(zhangxiang,chongqing),p(lihao,liaoning),p(wangming,hunan)
p(zhangxiang,chongqing),p(lihao,hunan),p(wangming,liaoning)
p(zhangxiang,liaoning),p(wangming,hunan),p(lihao,chongqing)
p(zhangxiang,liaoning),p(wangming,chongqing),p(lihao,hunan)
p(zhangxiang,hunan),p(wangming,liaoning),p(lihao,chongqing)
p(zhangxiang,hunan),p(wangming,chongqing),p(lihao,liaoning)
p(zhangxiang,chongqing),p(wangming,liaoning),p(lihao,hunan)
p(zhangxiang,chongqing),p(wangming,hunan),p(lihao,liaoning)
false.