Prolog条件语句

Prolog条件语句,prolog,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,

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

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. 
它给了我所有的月份,无论是炎热还是干燥的气候


尽管用“and”和“and”或“or”条件句概括了每个特征的具体位置,我还能做错什么呢?多谢各位

在计算谓词时使用括号强制优先:

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

您使用的是哪个版本的prolog?我刚试过你的密码,我得到了正确的答案。。。不同的编译器可能以不同的顺序处理运算符优先级,请使用括号来强制执行。事实似乎没有很好的逻辑组织。我想你可能会有一个不同的气候条件集合,在这种情况下,你会有一个小列表,比如
气候(6月20日,[炎热,干燥,微风])
。如果总有3种情况(如您所示),但每种情况都属于特定类别,则应将它们分配到固定的可变位置:
气候(月、日、风、温度、降水量)
。然后您的谓词变为
climatecheck(Month):-climate(Month,u,u,hot,dry)。
Oh my。。。感谢大师班:-)从某种意义上说,这不可能是OP所要求的-它需要
Month
成为
气候/5的主键
climatecheck(Month) :-
   climate(Month, _, X, Y, Z),
   % overkill generalization ahead :)
   maplist([P]>>memberchk(P, [X,Y,Z]), [hot, dry]).

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