天气预报

时间:2011-09-27 12:44:48

标签: prolog

彼得根据天气预报决定周末要做什么。

这是可用的信息: 周六将是晴天,周日将不确定。 每当天气晴朗时,彼得都会去海滩。 每当下雨,他就呆在家里。 当天气不确定时,取决于当天:周六他去看电影,星期天和家人一起散步。
在Prolog中代表前面的句子 制定允许回答以下问题的查询:
彼得下周六会怎么做? 彼得将在下周日留在家里吗? 这是我制作的代码,但不起作用:

out(saturday,suny,_). 
out(sunday,uncertain,_).

out(saturday,sunny,beach).
out(sunday, sunny, beach).
out(saturday,rainny,home).
out(sunday, rainny,home).


out(saturday,uncertain,cinema).
out(sunday,uncertain,family).

现在我不知道我应该回答什么问题......我想我可能会这样做:

:-out(saturday,_,X).

但它不起作用...... 如果有人能帮助我那将是伟大的。

1 个答案:

答案 0 :(得分:2)

它不起作用的主要原因是你不能统一你的事实。如果你从查询而不是程序的角度考虑它们,那么构建prolog程序会更容易。在你的代码中,你有匹配的阳光和阳光。如果你修复了拼写错误,你会得到这个:

?- out(saturday,_,X).
true ;
X = beach ;
X = home ;
X = cinema ;
true.

这仍然可能不是你想要的,因为它仍然匹配太多东西。试试这个:

weather(saturday, sunny).
weather(sunday, uncertain).

prefers(peter, if_weather(uncertain), onday(sunday), walk_with_family).
prefers(peter, if_weather(sunny), onday(_), go_to_beach).
prefers(peter, if_weather(uncertain), onday(saturday), go_to_cinema).
prefers(peter, if_weather(rainy), onday(_), stay_home).

peter_will_do_next(Day,X) :- prefers(peter, if_weather(Y), onday(Day), X),    weather(Day,Y).
peter_will_stay_home_on(Day) :- peter_will_do_next(Day,Y), Y == stay_home.

?- peter_will_do_next(saturday,What).
What = go_to_beach .

?- peter_will_stay_home_on(sunday).
false.

在此代码中,我们将天气的事实指定为一个程序和彼此的彼得的偏好(主要是为了清晰)。然后我们可以查询事实并得到一个(更有可能)你想到的结果。