我开始了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).
答案 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)。
玩得开心。