list - Prolog:如何检查列表是否包含来自众多事实的列表
问题描述
我是 prolog 的新手,并试图弄清楚如何解决这个问题。
Number1、number2 和 number3 是蛋糕名称。
Chocolate,mango,lemon... 是成分和数字,之后是我不需要用于此查询的价格,但它们必须存在。
icecream(number1, [chocolate,mango,lemon], 1.99).
icecream(number2, [vanille,lemon ], 1.79).
icecream(number3, [almonds, kiwi, walnut], 2.50).
询问:
which_icecream( [vanille,lemon,chocolate,mango], S).
S = number1;
S = number2.
谢谢!
解决方案
member/2
对非确定性交集使用两次:
which_icecream(DesiredIngredients, S) :-
icecream(S, Ingredients, _),
member(X, DesiredIngredients),
member(X, Ingredients).
请注意,由于许多成分多次匹配,因此将多次返回相同的结果:
?- which_icecream([vanille,lemon,chocolate,mango], S).
S = number1 ;
S = number1 ;
S = number1 ;
S = number2 ;
S = number2 ;
false.
删除重复项setof/3
:
?- setof(S, which_icecream([vanille,lemon,chocolate,mango], S), IceCreams).
IceCreams = [number1, number2].
使用intersection/3
内置的替代解决方案:
which_icecream(DesiredIngredients, S) :-
icecream(S, Ingredients, _),
intersection(Ingredients, DesiredIngredients, Intersection),
Intersection \= [].
推荐阅读
- excel - 如何从单个持续时间计算总持续时间
- django - 如果在 django orm 中发生删除,如何计算级联项目的数量
- c++ - 虽然循环正在用太多值填充我的二维数组
- c# - 当要显示的文本数据在 C# 中通过 V4 开发的 BOT 中更多时,有没有办法显示带有滚动条选项的卡片?
- java - 检查字符串是否没有字母
- http - 我有关于 Delphi 中的 TRESTRequest 的问题
- cakephp - Cakephp2.2 文件到 Cakephp3.7 安装以便于迁移:)
- sql-server - SQL Server 可以连接到同一 LAN 上的特定 IP 地址吗?
- xslt - 如果子节点具有不同的属性,如何获取子兄弟节点?
- azure - Azure Devops 发布管道无法将 Web 包部署到应用服务。禁止IP 403