我想将谓词设置为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
答案 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]