0

对于哥伦比亚的 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 是一个新组织,旨在模拟哥伦比亚经济,以预测法律变化的影响,类似于美国国会预算办公室或税收政策中心所做的事情。

4

2 回答 2

2

首先,让我们在程序中添加以下定义:

:- op(950,fy, *)。
*_。

使用(*)/1,我们可以概括出程序中的各个目标。

例如,让我们minimize/1通过将目标放在*前面来概括目标:

taxableIncome(谁,TI):-
        扣除(谁,D),
        收入(谁,我),
        TI #= I - D,
        *最小化(TI)

我们现在得到:

?-应税收入(X,Y)。
X =乔,
Y = 7 ;
X =乔,
Y = 6。

这表明 CLP(R) 实际上与这个问题无关!这些答案表明,在调用时一切都已经实例化minimize/1,因此没有什么可以最小化了。

要真正受益于minimize/1,您必须以 CLP(R) 或更好的形式:CLP(Q)-约束来表达任务,然后应用于minimize/1受约束的表达式。

另请注意,在 SWI-Prolog 中,CLP(R) 和 CLP(Q) 都有基本错误,您不能相信它们的结果。

于 2018-01-06T07:47:28.020 回答
1

根据 Mat 的回复,我使用 CLP 重写了表达约束的程序。棘手的一点是我必须首先收集所有(两个)可能的扣除值,然后将这些值转换为 CLP 域。我无法让这种转换在 CLP(R) 中工作,但我可以在 CLP(FD) 中工作:

:- use_module(library(clpfd)).

deduction(_,3).     % Anyone can take the same standard deduction.
deduction(Who,D) :- % Or they can itemize.
    itemizedDeduction(Who,D).

income(joe,10).
itemizedDeduction(joe,4).

listToDomain([Elt],Elt).
listToDomain([Elt|MoreElts],Elt \/ MoreDom) :-
    MoreElts \= []
    , listToDomain(MoreElts,MoreDom).

taxableIncome(Who,TI) :- 
    income(Who,I)
    , findall(D,deduction(Who,D),DList)
    , listToDomain(DList,DDomain)
    % Next are the CLP constraints.
    , DD in DDomain
    , TI #= I-DD
    , labeling([min(TI)],[TI]).
于 2018-01-07T00:10:25.853 回答