对于哥伦比亚的 Observatorio Fiscal[1],我正在编写一个简单的税收最小化问题,使用 CLP(R)(在 SWI-Prolog 中)。我想先使用最小化/1 找到最小的解决方案。相反,它首先列出更大的解决方案。这是代码:
:- use_module(library(clpr)).
deduction(_,3). % Anyone can take the standard deduction.
deduction(Who,D) :- itemizedDeduction(Who,D). % Or they can itemize.
income(joe,10). % Joe makes $10 a year.
itemizedDeduction(joe,4). % He can deduct more if he itemizes.
taxableIncome(Who,TI) :-
deduction(Who,D),
income(Who,I),
TI is I - D,
minimize(TI).
这是交互式会话的样子:
?- taxableIncome(joe,N).
N = 7 ;
N = 6 ;
false.
如果我将“最小化”这个词切换为“最大化”,它的行为是相同的。如果我不包含最小化或最大化子句,它不会寻找第三种解决方案,但除此之外它的行为相同:
?- taxableIncome(joe,N).
N = 7 ;
N = 6.
[1] Observatorio Fiscal 是一个新组织,旨在模拟哥伦比亚经济,以预测法律变化的影响,类似于美国国会预算办公室或税收政策中心所做的事情。