首页 > 解决方案 > 列出序言中的交集

问题描述

我是 Prolog 的新手,我尝试编写 5 个列表并获取它们之间的交集,我如何实现这一点,** 列表将在文件中定义,因此它不是来自用户的输入。

我看到很多资源,他们用两个列表实现它,如果我将列表作为用户的查询,它的工作正常......但是当我尝试在文件中预定义列表时它不起作用。


对我的项目的一部分进行简单描述以更清楚地说明...菜单将显示,用户将从每个季节、天气状况、场合中选择一个...列表将列出适合的衣服

例如,用户选择“冬季”季节、“下雨”天气状况和“婚礼”场合列表

    rainy([take_umbrella, jacket,coat]).
winter([jacket,sweater,coat,take_umbrella]).
wedding ([take_umbrella,dress,jacket,coat]).

所以结果形式的交集将是 take_umbrella ,jacket,coat

我希望我的想法很清楚,并提前谢谢你:)

标签: listprologintersection

解决方案


我尝试在文件中预定义列表,它的工作。你在文件中的列表不起作用?我不知道。我修复了你的错误,因为你的粘贴不是没有错误的,然后它就可以工作了。

?- winter(Winter),
   rainy(Rainy),
   wedding(Wedding),
   intersection(Winter, Rainy, Winter_and_Rainy),
   intersection(Winter_and_Rainy, Wedding, Winter_and_Rainy_and_Wedding).
Winter = [jacket, sweater, coat, take_umbrella],
Rainy = [take_umbrella, jacket, coat],
Wedding = [take_umbrella, dress, jacket, coat],
Winter_and_Rainy = Winter_and_Rainy_and_Wedding, Winter_and_Rainy_and_Wedding = [jacket, coat, take_umbrella].

但如果不知道有多少列表,您可能会列出并减少列表。

?- % make some lists L1, L2, ..., Ln,
   foldl(intersection, [L1, L2, ..., Ln-1], Ln, Intersection).

在下雨的婚礼上冬天是什么时候,你会减少:

?- winter(Winter), rainy(Rainy), wedding(Wedding),
   foldl(intersection, [Winter, Rainy], Wedding, Intersection).
Winter = [jacket, sweater, coat, take_umbrella],
Rainy = Intersection, Intersection = [take_umbrella, jacket, coat],
Wedding = [take_umbrella, dress, jacket, coat].

你看到元素的顺序是变化的,但它有问题吗?对我来说没问题。


推荐阅读