假设我们被赋予了某些事实,我们应该写出一个特定的规则来探索这些事实中的特定条件,例如,如果我们被赋予某些气候及其特征:
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.
它给了我所有有炎热或干燥气候的月份。
尽管用“和”和“或”条件概述了每个特征的具体位置,但我能做些什么呢?谢谢。
答案 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.