Prolog技术问询:如何筛选配料列表被目标列表包含的冰淇淋
解决Prolog冰淇淋配料匹配问题
嘿,作为Prolog新手能尝试解决这个问题已经很棒啦!我来帮你实现这个which_icecream/2查询,满足你要找出配料列表被目标列表完全包含的冰淇淋需求~
首先,咱们先把题目里给定的事实原封不动保留下来:
icecream(number1, [chocolate,mango,lemon], 1.99). icecream(number2, [vanille,lemon ], 1.79). icecream(number3, [almonds, kiwi, walnut], 2.50).
接下来核心是实现判断“冰淇淋配料列表的所有元素都在目标列表里”的逻辑,咱们可以先写一个辅助谓词all_in/2来完成这个检查:
% 空列表的所有元素自然都在目标列表里 all_in([], _TargetList). % 非空列表:第一个元素在目标列表里,且剩余元素也都在目标列表里 all_in([Member|Rest], TargetList) :- member(Member, TargetList), all_in(Rest, TargetList).
然后就可以定义咱们需要的which_icecream/2谓词了:
which_icecream(TargetIngredients, IcecreamNumber) :- icecream(IcecreamNumber, Ingredients, _Price), all_in(Ingredients, TargetIngredients).
测试一下你的查询
现在运行你需要的查询:
?- which_icecream([vanille,lemon,chocolate,mango], S).
你会得到期望的结果:
S = number1 ; S = number2.
为什么number3不会被返回呢?因为它的配料almonds、kiwi、walnut都不在你给定的目标配料列表里,不符合“配料列表被目标列表包含”的条件~
内容的提问来源于stack exchange,提问作者user9746492
相关产品推荐
相关产品推荐

