【问题标题】:Prolog beginner level, word logicProlog初学者级别,单词逻辑
【发布时间】:2018-04-01 23:14:50
【问题描述】:

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

编写一个谓词eats_all(Person, Food),根据谓词eats(Name,Item )。如果 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). 

【问题讨论】:

    标签: prolog


    【解决方案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)。

    玩得开心。

    【讨论】:

    • 感谢 tudatn。我已经尝试将一个子问题放在主要问题之上。这种方式似乎通过了这两项测试,但由于可能是巧合,因此测试很少。这对你来说是正确的,还是我应该使用第三位代码将这两个部分结合起来?感谢您的帮助 - Prolog 的教科书不是很好。
    • 您的递归大小写不正确。看看我的编辑答案。
    • 很抱歉,根据您的编辑,我无法使其正常工作。当我这样做时,我会得到错误的答案,例如:eats_all([john,tony],[pizza,burgers])。现在是假的。应该是真的。
    • Mine 在您给定的示例中返回 true。我将在我的编辑答案中将所有功能放在一起。让我们看看它是否适合你:)。
    • 非常感谢 - 效果很好。我不知道以前是什么,但这次一切都好。我真的很感谢你的帮助。不过,我不能赞成这个答案,因为它说新成员不能投票。不过我可以给它一个绿色的勾号。谢谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-09
    • 2013-09-13
    • 2013-09-29
    相关资源
    最近更新 更多