首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用prolog从配料集合生成菜谱

使用prolog从配料集合生成菜谱
EN

Stack Overflow用户
提问于 2013-10-17 21:15:26
回答 1查看 725关注 0票数 5

我可以用我已经知道的语言来解决这个问题,但是我希望使用prolog (或者clpfd)来解决这个问题,因为我想学习这些技术。我看到了一些关于使用SQL的类似问题的引用,但这不是我感兴趣的地方。

我收集了一些成分,每种成分都有卡路里计数、蛋白质量、脂肪量等特性,不会超过几十种成分,而且可能不会超过六种成分。在C语言中,我会将其建模为一个结构数组。

然后,我想要能够生成的食谱,使用组合的成分,但受到限制。例如,总卡路里< 1000,脂肪少于30%,超过25g蛋白质。我也可能想说“不包括白米”,例如因为我现在没有白米了。

答案可能是“125克鸡肉,25克胡萝卜,100克米饭”这样的商品清单。

我是否在正确的轨道上使用prolog/cplfd来做这件事?是否有特别的困难会使它不适合初学者(虽然我是一个有经验的程序员在其他语言)?

我该如何建模这个数据库?我看到prolog有列表和元组。我能用元组列表来表达吗?

我能表达像“总卡路里< 1000,脂肪中热量< 30%,蛋白质>25克”这样的数学约束吗?

这类问题有什么我可以搜索的名字吗?

我是否可以使用现有的prolog示例作为指南?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2013-10-18 17:32:52

这将是一个非常整洁的程序,我希望你将实现整个事情,并写它。请让我知道你想出了什么!

我可以很容易地看到如何处理示例约束。代码将如下所示:

代码语言:javascript
复制
% these operator declarations are just guesses!
:- op(500, xfy, and).
:- op(600, xf, grams).
:- op(600, yfx, of).

test(Recipe, X < Y) :- 
  evaluate(Recipe, X, XV), 
  evaluate(Recipe, Y, YV), 
  XV < YV.

test(Recipe, X and Y) :- 
  test(Recipe, X), test(Recipe, Y).

evaluate(Recipe, total_calories, X) :- total_calories(Recipe, X).
evaluate(Recipe, Const, Const) :- number(Const).

total_calories(Recipe, Total) :- 
  maplist(calories, Recipe, Calories), 
  sum(Calories, Total).

calories(X grams of Y, Calories) :-
  caloric_content(N grams of Y, C),
  Calories is X/N * C.

caloric_content(100 grams of chicken, 195).

我认为这是一个不错的草图,我将如何继续测试食谱。产生它们将是非常有趣的。我想你会想要限制你的食谱写作。弄清楚如何约束它最好的办法可能是天真地写出它,然后逐个引入修正。我的猜测是这样的:

代码语言:javascript
复制
meat(chicken).
vegetable(carrots).

recipe([MeatAmount grams of Meat, VegAmount grams of Vegetable]) :- 
  meat(Meat), 
  vegetable(Vegetable),

然后你会想要用某种方式来猜测这个数字。另一个要探索的想法是将这两个方面结合起来,以便您添加的每个成分都处理一些约束。这样你就可以保持搜索的方向,而不是漫无目的地把东西放在一起。我希望这能给你一些想法!

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19437444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档