我正在学习 Prolog,我想根据卡路里建立一个食谱推荐。因此,根据您输入的卡路里数量,我想返回早餐、午餐和晚餐的组合。
早餐、晚餐和午餐的组成不同,所以在这种情况下,早餐由饮料和菜肴组成,而菜肴本身则由谷物、水果或蔬菜以及动物源性食品组成。
现在,我正在尝试获取所有可能的早餐我有以下 Prolog 代码
dish([Cereal, FruitOrVegetable, AnimalOrigin], Calories) :-
cereal(Cereal, CerealCalories),
(
fruit(FruitOrVegetable, FruitOrVegetableCalories);
vegetable(FruitOrVegetable, FruitOrVegetableCalories)
),
animalOrigin(AnimalOrigin, AnimalOriginCalories),
Calories >= CerealCalories + FruitOrVegetableCalories + AnimalOriginCalories.
breakfast([Drink, Dish], Calories) :-
drink(Drink, DrinkCalories),
dish(Dish, DishCalories),
Calories >= DrinkCalories + DishCalories.
如果我执行菜功能,它只需要 600 卡路里,它会返回给定食物的组合,但是当我尝试实现相同的逻辑来组成早餐功能时,它会抛出以下错误
Arguments are not sufficiently instantiated
而且我搜索了一会儿,发现是因为一个 var 是 inst 初始化的,但是我没有找到问题的根源。
知识数据库声明的一个例子是
cereal(flakes, 386).
fruit(apple, 52).
vegetable(broccoli, 31).
animalOrigin(chicken_breast, 134).
drink(water, 0).
其中第一个是食物的名称,第二个是卡路里