Prolog subBag(x,y)测试x(被视为包)是否是y的子包

时间:2018-04-16 03:15:11

标签: prolog

我目前正在处理一些prolog问题,一个是" subBag(x,y)测试x,被视为包,是否是y"的子包。我的代码根本不起作用,而且总是如此。这是我的代码。

field1, field2

谢谢。

2 个答案:

答案 0 :(得分:0)

我完全不了解你的代码应该如何工作,但我认为在没有必要的地方肯定会有过多的分裂到头部和尾部。

也许这个谓词可以帮助你解决问题。

isSublist(Sublist,List) :-
    append([_,Sublist,_],List).

此谓词使用append / 2内置谓词read about it here

答案 1 :(得分:0)

什么是子包?我认为这意味着,子包中的所有物品的数量至少与它们在收纳袋中的数量相同。为了归纳它,让我们把它分成两种情况:我有一个空列表的情况。那是一个子包吗?是的,任何清单:

subbag([], Bag) :- is_list(Bag).

现在,归纳案例。让我们将子包分成一个项目和子包的其余部分。如果这个物品可以从收纳袋中取出,其余部分从收纳袋中形成剩余的子袋,那么我们就有一个子袋。像这样:

subbag([X|Subbag], Bag) :-
    select(X, Bag, RemainingBag),
    subbag(Subbag, RemainingBag).

魔术谓词https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk-ec2/1.11.308在这里是一个非常有用的实用程序,允许您在一个语句中说X位于Bag,其余部分位于RemainingBag }。在Prolog中处理列表时,这种情况似乎总是出现。 (请注意,在SWI Prolog文档中,名称旁边通常会有一个小的:-图标,这会将您带到该谓词的源代码,以防您被赋予愚蠢的要求。使用一个无能的教授的内置谓词。)

我想警告你,这个解决方案的效率并不高,但我实际上认为这个问题的本质可能就是这样。您将从查询中获得的解决方案数量(如subbag(X, [1,2,3,4,5]))将会很大;我发现它基本上是一组的排列数,使用OEIS(序列select/3)。