从列表中选择特定列表

时间:2019-04-30 14:30:28

标签: prolog

我想将谓词设置为to_buy(Goods,Offers,Price,Quality),当列表中的Offer时具有价格的总价和Quality的总质量时,则为true,但是我确实要商品的产品。如果没有可以完全涵盖商品产品的报价清单,我将什么也买不到,谓词就会失败。例如:

我试图找到所有包装的商品子集,并将它们存储在列表中,然后如果我追加它们并对其进行msort排序,则从中找到它们。 我有这样的软件包:

packages([products],Price,Quality).
packages([1,2,3],10,5).

to_buy(Goods,Offers,Price,Quality):-
   findall(X,( subset(X,Goods), package(X,Price,Quality)),List),
   setof( (X,Y),
           (  member(X,List),
              member(Y,List),
              append(X,Y,AList),
              msort(AList,Goods)
           ),Offers).

我期望的是以下屏幕截图: Expected Output

1 个答案:

答案 0 :(得分:0)

我发现你的姿势和舞蹈有点混乱。我的实现使用了52.191.0.0/18中的一些SWI函数,但会自动加载。

我们必须始终从基本情况开始

library(lists)

这表示如果我们什么都没买,就没有报价,价格和质量为零。现在是递归的情况:

to_buy([], [], 0, 0).

因此,这里的一个好主意也是使用to_buy(Goods, [Package|OtherPackages], TotalPrice, TotalQuality) :- %% choose a package package(Package, Price, Quality), %% this package is a subset of the goods we need subset(Package, Goods), %% after buying this package, we will still need RemainingGoods subtract(Goods, Package, RemainingGoods), %% recur on the remaining goods to_buy(RemainingGoods, OtherPackages, Subtotal, SubtotalQuality), TotalPrice is Subtotal + Price, TotalQuality is SubtotalQuality + Quality. 来给我们设置差异。由于我们知道Package是商品的子集,因此我们不会购买不需要的商品(即,如果我们尝试购买subtract/3,则不会选择[1,2,5]的报价,因为{ {1}}不是[1,2,3,4]的子集。然后,我们可以简单地按集合差异进行递归,然后对递归调用返回的结果进行记账。

我对此数据库进行了测试:

[1,2,5]

和此查询:

[1,2,3,4]