Prolog初学者级别,单词逻辑

时间:2018-04-01 23:14:51

标签: prolog

我开始了Prolog课程,并且我被给了以下单词作为家庭作业。我理解算术问题很好,但我很难将这个词问题弄清楚。我已经粘贴了我的解决方案,但它只能成功进行第一次测试,而不是第二次测试。你能帮我理解我做错了什么吗?在教科书中,“每个人”的问题经常使用_表示它可能是任何人,所以我想知道这是否是我所缺少的?或者我的逻辑是错的?谢谢!

写一个带有人名单的谓词eats_all(人,食物)人物和物品清单如果每个人在食物中吃掉食物中的每个物品,根据谓词吃,食物和成功)。如果Person或Food为空,它将成功。 测试用例:

?- eats_all([john,tony],[pizza,burgers]).
true
?- eats_all([],[tacos]).
true

事实:

eats(melissa, pizza).
eats(melissa, pies).
eats(melissa, hotdogs).
eats(tony, burgers).
eats(tony, pizza).
eats(john, pizza).
eats(john, burgers).

到目前为止我的解决方案:

% the first person in Person list eats all foods in Food list (sub-problem);
first_person(_, []).
first_person(X, [Head_Food|Tail_Food]) :-
    eats(X, Head_Food),
    first_person(X, Tail_Food).

% main problem
eats_all([], _).            
eats_all([Head_Person|Tail_Person], [Head_Food|Tail_Food]):-   
    eats(Head_Person, Head_Food),  
    eats_all(Tail_Person, Tail_Food). 

1 个答案:

答案 0 :(得分:1)

你快到了那里。因为你是prolog的新手,将问题分解为子问题是件好事。首先,让我们递归思考:

- Base case: eats_all(_, []). and eats_all([], _).
- Recursive case: 
      + the first person in Person list eats all foods in Food (here is a subproblem); 
      + recursive call of the function eats_all for the rest of Person list.

% sub-problem: succeed if a person X eats all foods in Food
eat_all_food(_, []).
eat_all_food(X, [F|Fs]) :-
eats(X, F),
eat_all_food(X, Fs).

% main problem: succeed if all persons in Person eat all foods in Food
eats_all([], _).
eats_all(_, []).
eats_all([X|Xs], Y) :-
   eat_all_food(X, Y),
   eats_all(Xs, Y).

还有一件事:使用_只意味着你不关心参数的值是什么(如在基本情况中所见,当Food是一个空列表时,无论Person如何,函数总是返回true)。

玩得开心。