Prolog条件陈述

时间:2017-03-24 08:31:47

标签: prolog

假设我们被赋予了某些事实,我们应该写出一个特定的规则来探索这些事实中的特定条件,例如,如果我们被赋予某些气候及其特征:

climate(jun, 20, snow, wind, cold).
climate(jul, 20, hot, dry, calm).
climate(sep, 15, calm, dry, cool).
climate(sep, 16, rain, hot, calm).
climate(sep, 18, warm, rain, calm).
climate(oct, 29, cool, dry, calm).
climate(nov, 1, cold, snow, wind).
climate(nov, 5, hot, snow, wind).
climate(dec, 15, warm, rain, wind).
climate(dec, 21, wind, cold, dry).

如果我们想知道哪些气候炎热干燥,我们会做这样的事情:

climatecheck(Month) :-
   climate(Month, _, hot, _, _);
   climate(Month, _, _, hot, _);
   climate(Month, _, _, _, hot),
   climate(Month, _, dry, _, _);
   climate(Month, _, _, dry, _);
   climate(Month, _, _, _, dry).

我尝试了上面的方法,但似乎没有用。

而不是给我:

Month = jul. 

它给了我所有有炎热或干燥气候的月份。

尽管用“和”和“或”条件概述了每个特征的具体位置,但我能做些什么呢?谢谢。

2 个答案:

答案 0 :(得分:3)

使用括号强制评估谓词的优先级:

climatecheck(Month) :-
   (  climate(Month, _, hot, _, _)
   ;  climate(Month, _, _, hot, _)
   ;  climate(Month, _, _, _, hot)
   ),
   (  climate(Month, _, dry, _, _)
   ;  climate(Month, _, _, dry, _)
   ;  climate(Month, _, _, _, dry)
   ).

答案 1 :(得分:2)

climatecheck(Month) :-
   climate(Month, _, X, Y, Z),
   % overkill generalization ahead :)
   maplist([P]>>memberchk(P, [X,Y,Z]), [hot, dry]).

?- climatecheck(Month).
Month = jul ;
false.