Prolog 如果事实的单个参数与规则匹配,则返回true

Prolog 如果事实的单个参数与规则匹配,则返回true,prolog,Prolog,我得到以下错误: Singleton Variables: [Month] 在SWI Prolog中运行我的文件 我有以下形式的事实: weather(Month, Day, Word1, Word2, Word3). 我有以下规则: % Summer: True if Month is jun, jul, or aug summer(Month) :- weather(jun, _, _, _, _); weather(jul, _, _, _, _); weath

我得到以下错误:

Singleton Variables: [Month]
在SWI Prolog中运行我的文件

我有以下形式的事实:

weather(Month, Day, Word1, Word2, Word3).
我有以下规则:

% Summer: True if Month is jun, jul, or aug
summer(Month) :-
    weather(jun, _, _, _, _);
    weather(jul, _, _, _, _);
    weather(aug, _, _, _, _).
我是prolog新手,不明白为什么会出错。
提前谢谢

在Prolog中,以大写字母开头的标识符被用作变量,因此在您的示例中,Month是一个变量,在summer/1谓词中从未被实例化(只是在谓词中从未使用过),这就是为什么它会给您一个单例变量的警告(而不是错误)

为了修复它,您可以编写一些东西来实例化变量Month,如:

summer(Month) :-
    weather(jun, _, _, _, _),Month = jun;
    weather(jul, _, _, _, _),Month = jul;
    weather(aug, _, _, _, _),Month = aug.
在上面对summer/1的定义中,由于您编写了所有案例,您可以看到没有必要使用facts
weather(月、日、字1、字2、字3)。
因为您可以编写:

summer(Month) :-
        Month = jun;
        Month = jul;
        Month = aug.
或者@false建议您可以添加以下事实:

summer(jun). 
summer(jul). 
summer(aug).
夏季(六月)。夏季(七月)。summer(8月)。
甚至
summer_月(月):-成员(月,[jun,jul,aug])。
但我更喜欢@false建议的基于事实的方法,因为它们是完全固定的关系。要填写更多信息,可能需要
季/月(夏季,六月)。季节/月份(夏季、七月)。。。季节/月份(秋季、九月)…
等。