首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Prolog |获取一个列表,其中的元素与其他列表和一个常量值一起计算

Prolog |获取一个列表,其中的元素与其他列表和一个常量值一起计算
EN

Stack Overflow用户
提问于 2020-11-05 07:30:20
回答 1查看 49关注 0票数 0

我有一个关于电影和系列片发行企业的作业。我必须做一个谓词,在这个谓词中,我将传递一个值和月份,它将返回一个排序列表,其中包含合同编号,该合同编号的月份支付总额应该大于值。

我将总金额的公式放在下面

代码语言:javascript
复制
Total amount = minimum amount + royalty amount
Royalty amount = (monthly net - minimum amount)*royalty percent
Monthly net = monthly income - distribution spending - cost percent
Cost percent = (monthly net - minimum amount)*cost percent

我为版税金额和每月净值做了预测,代码是这样的:

代码语言:javascript
复制
contract('A255', 'Distributor A', 'CSI Las Vegas', '3M3520', '2', ['DVD', 'Streaming'], 30.000).
contract('A566', 'Distributor B', 'Ghost Hunters', '1Q2010', 1, ['Cinema'], 50.000).
contract('A897', 'Distributor A', 'Sherlock Holmes', '1M2020', 2, ['DVD', 'BlueRay', 'TVP', 'Streaming'], 75.000).
contract('A123', 'Distributor C', 'Lion King', '2Q3015', 1, ['DVD', 'BlueRay', 'TVP', 'Streaming'], 65.000).
contract('A453', 'Distributor B', 'La odisea de los giles', '1M2020', 1, ['Cinema'], 35.000).
contract('A690', 'Distributor C', 'El Robo del Siglo', '1Q2010', 1, ['Cinema'], 45.000).

%Contract number, income date(day, month, year), income amount, spendings amount, country.
monthlyIncomes('A123', date(15, 03, 2020), 45000, 17500, 1).
monthlyIncomes('A123', date(31, 03, 2020), 20000, 16500, 1).
monthlyIncomes('A123', date(30, 06, 2020), 50000, 22500, 3).
monthlyIncomes('A453', date(12, 06, 2020), 30000, 15000, 2).
monthlyIncomes('A453', date(28, 06, 2020), 25000, 15000, 2).
monthlyIncomes('A690', date(02, 02, 2020), 12000, 13500, 3).
monthlyIncomes('A690', date(29, 02, 2020), 95500, 13500, 3).
monthlyIncomes('A690', date(31, 03, 2020), 80000, 12500, 1).
monthlyIncomes('A897', date(16, 03, 2020), 40000, 17000, 2).
monthlyIncomes('A897', date(31, 03, 2020), 15000, 17000, 2).
monthlyIncomes('A897', date(02, 29, 2020), 50000, 17000, 1).
monthlyIncomes('A566', date(30, 04, 2020), 50000, 16500, 3).
monthlyIncomes('A255', date(10, 04, 2020), 72000, 14500, 3).
monthlyIncomes('A255', date(30, 04, 2020), 90000, 14500, 3).
monthlyIncomes('A540', date(12, 06, 2020), 30000, 10800, 2).
monthlyIncomes('A540', date(30, 06, 2020), 30800, 10700, 2).
monthlyIncomes('A540', date(31, 07, 2020), 30500, 10600, 1).
monthlyIncomes('A120', date(31, 07, 2020), 25500, 23400, 1).
monthlyIncomes('A234', date(15, 05, 2020), 75600, 12800, 1).
monthlyIncomes('A234', date(31, 05, 2020), 75600, 12800, 1).

%Royalty, name, percentage to pay, cost percentage, country.
royalties('1Q2010', 'Royalty 1', 0.20, 0.10, 1).
royalties('1M2020', 'Royalty 2', 0.20, 0.20, 2).
royalties('2Q3015', 'Royalty 3', 0.30, 0.15, 1).
royalties('2M2515', 'Royalty 4', 0.25, 0.15, 2).
royalties('3M3520', 'Royalty 5', 0.35, 0.20, 3).

%id, name
product_type(1, 'Film').
product_type(2, 'Serie').

country(1, 'Argentina').
country(2, 'New Zeland').
country(3, 'Albania').

get_net_value(Contract, Month, Net) :-  
    findall(Incomes, monthlyIncomes(Contract, date(_, Month, _), Incomes, _, _), Incomes),                  
    findall(Spendings, monthlyIncomes(Contract, date(_, Month, _), _, Spendings, _), Spendings), 
    sumlist(Incomes, SumIncomes), sumlist(Spendings, SumSpendings), 
    Net1 is SumIncomes - SumSpendings,
    contract(Contract, _, _, Royalty, _, _, MinimumAmount), royalties(Royalty, _, _, PctCost, _),
    Net is Net1 - Net1*PctCost.

royalty_amount(Contract, Month, RoyaltyAmount) :-
    get_net_value(Contract, Month, Net),
    contract(Contract, _, _, Royalty, _, _, MinimumAmount),
    royalties(Royalty, _, _, PctCost, _),
    RoyaltyAmount is (Net - MinimumAmount)*PctCost.

amount_by_value(Value, Month, Contract) :- 
    findall(Contract, monthlyIncomes(Contract, date(_, Month, _), _, _, _), Contract),
    findall(MinimumAmount, monthlyIncomes(_, date(_, Month, _), MinimumAmount, _, _), MinimumAmount).

这是一个谓词,我在其中遇到了麻烦。,amount_by_value。使用当前的代码,我得到了一个带有合同数量的合同列表和另一个带有用于总金额演算的最小金额的列表MinimumAmount,但我不知道如何获得每个合同的版税金额。我试着使用maplist(royalty_amount, Contract, [Month], Royalties).这行代码。这就是问题标题的原因,常量值是月份,列表是合约,但这一次它返回布尔值false。有人能给我一些建议吗?我将不胜感激

EN

回答 1

Stack Overflow用户

发布于 2020-11-07 05:06:35

让我试着帮你。您必须阅读findall/3预定义谓词。它在get_net_value/3和amount_by_value/3中的使用永远不会成功。

findall(VarGoalListOfVars)。Var要么是非单变量(X),要么是模板(例如,列表或带有一个或多个变量的函数式)。单个或多个变量出现在Goal中。只要Goal成功,Var的当前值就会收集到ListOfVars中。

因此,ListOfVars强制是一个列表,它永远不能等于变量值,就像您在get_net_value/3和_by_value/3谓词中使用的那样。

希望它能帮上忙!或者进一步解释你的问题。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/64689162

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档