我可以使用我已经知道的语言来解决这个问题,但是我希望使用prolog(也许是clpfd)来实现它,因为我想学习这些技术。我看到一些使用SQL的类似问题的引用,但这不是我感兴趣的。
我有一系列成分,每种成分都有卡路里计数,蛋白质含量,脂肪量等特性。不会有超过几十种成分,可能不超过六打属性。在C中,我将其建模为结构数组。
然后,我希望能够生成使用受限制成分组合的配方。例如,总卡路里<1。 1000和脂肪少于30%和超过25克蛋白质。我可能还想说“排除白米饭”,例如因为我现在已经没有白米了。
答案可能是“125克鸡肉,25克胡萝卜,100克蒸米饭”等项目清单。
我是否正确地使用prolog / cplfd执行此操作?是否存在使其不适合初学者的特殊困难(尽管我是其他语言的有经验的程序员)?
我如何为这个数据库建模?我看到prolog有列表和元组..我会把它表示为元组列表吗?
我是否能够表达数学上的限制,例如“总热量<1000,脂肪中的卡路里<30%,总卡路里和蛋白质> 25g”?
我可以搜索这类问题的名称吗?
我是否可以使用现有的prolog示例作为指南?
答案 0 :(得分:1)
这将是一个非常简洁的程序,我希望你能实现整个事情并写下来。请告诉我你的想法!
我可以很容易地看到如何处理您的示例约束。代码看起来像这样:
% 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).
我认为这是一个很好的草图,我将如何继续测试食谱。生成它们将非常有趣。我想你会想要限制你的食谱写作。弄清楚如何约束它的最好的事情可能是天真地写它然后逐个引入校正。我最好的猜测是这样的:
meat(chicken).
vegetable(carrots).
recipe([MeatAmount grams of Meat, VegAmount grams of Vegetable]) :-
meat(Meat),
vegetable(Vegetable),
然后你会想要以某种方式猜测金额来增加它。另一个探索的想法是将这两个方面结合起来,以便您添加的每个成分都处理一些约束。这样你就可以保持搜索的目的,而不是漫无目的地将事物放在一起。我希望这会给你一些想法!