如何比较用户输入与规则和事实?

时间:2014-10-21 10:54:40

标签: prolog

我想构建这个解决方案: Prolog向我询问我的首选天气日期,并告诉我最佳匹配(不完全匹配,取决于学位)。

例如: 给出清单

Monday = [hot, sunny, 30] //30 degree
Tuesday = [hot, cloudy, 25]
Wednesday = [hot, sunny, 25]

问题1: 你喜欢热还是冷? 答案1:热门

问题2: 你喜欢晴天还是阴天? 答案2:晴天

问题3: 什么是最低温度? 答案3:22

- >现在Prolog应该回答这个问题:

度假的最佳日子是:

Monday = [hot, sunny, 30] 
Wednesday = [hot, sunny, 25]

我的代码:

/* Ask all Questions */
go: -
  q1,
  q2,
  q3.

/* Questions 1 */
q1: -
  abolish(q1 / 1), /* clear clause, if q1 is used by user manually */
  write('Do you like it hot or cold?'),
  read(Q1),
  asserta(q1(Q1)).

/*same for Q2 and Q3*/

最后我有这个:

  q1(hot)
q2(sunny)
q3(22)

我可以将它与列表进行比较,所以我[热,晴,22](不知道为什么,但我可以这样做)

现在我真的不知道如何比较预先列表和我的答案。不知道比较温度。

有人可以帮我举个例子吗?我真的想了解Prolog,但我不知道如何处理这个问题。

1 个答案:

答案 0 :(得分:1)

这是你可以做到的一种方式。我已将表示更改为类型日的事实而不是列表。

day(monday,hot,sunny,30).
day(tuesday,hot, cloudy,25).
day(wednesday,hot,sunny,25).

go:-
    q1(X),
    q2(Y),
    q3(Z),
    day(Day,X,Y,Z1),
    Z1 >=Z, %this will back track and find other results if the first one found fails
    print([Day,X,Y,Z1]). %this can be made more pretty if you wish.


q1(X):-
   write('Do you like it hot or cold?'),
   read(X).

q2(Y):- write('Do you like it sunny or cloudy?'),
  read(Y).

q3(Z):- write('What is the minimum temperature?'),
  read(Z).