我遇到这个初学者问题,我不知道如何解决这个问题.这是我的代码:
worker( w1, d1, 2000 ) .
worker( w2, d1, 2500 ) .
worker( w2, d2, 1000 ) .
worker( w3, d2, 2000 ) .
worker( w4, d2, 4000 ) .
% worker( W, D, S ) means that worker W works in department D and has salary S
department( d1, w2 ) .
department( d2, w4 ) .
% department( D, B ) means that worker B is director of department D(this is not important in this case)
Run Code Online (Sandbox Code Playgroud)
我需要从部门中获得所有工资的总和,如下所示:
?- department_costs( d1 , T ) .
T = 4500;
no
?- department_costs( D, T ) .
D = d1
T = 4500;
D = d2
T = 7000;
no
?- department_costs( d3 , T ) .
no
Run Code Online (Sandbox Code Playgroud)
我试过这个:
department_costs( D, T ):- worker( _X, D, T1 ), T is T1.
Run Code Online (Sandbox Code Playgroud)
我得到了这个:
?- department_costs( o1, T ).
T=2000;
T=2500;
no
Run Code Online (Sandbox Code Playgroud)
现在我需要总结T + T总成本,但我不知道该怎么做.我想在不使用findall/setof/bagof的情况下解决这个问题.
编辑:
我试着用findall:
sumL([], 0).
sumL([G|R], S):-
sumL(R, S1),
S is S1 + G.
department_costs( D, T ):-
findall(P, worker( _X, D, P ), R ),
sumL(R, S),
T=S.
Run Code Online (Sandbox Code Playgroud)
它可以与department_costs(d1,T)和department_costs(d2,T)一起使用,但是当我输入department_costs(D,T)时.我明白了:
department_costs( D, T ).
O=_h159
T=11500
Run Code Online (Sandbox Code Playgroud)
它应该是这样的:
?- department_costs( D, T ) .
D = d1
T = 4500;
D = d2
T = 7000;
Run Code Online (Sandbox Code Playgroud)
有人能说出现在的问题吗?
想要解决这个问题findall/3只会导致重新编码的不良尝试findall/3.如果您真的想跳过findall/3,请以不同的方式表示您的数据,例如:
workers([w1-d1-2000, w2-d1-2500, w2-d2-1000, w3-d2-2000, w4-d2-4000]).
departments([d1-w2, d2-w4]).
Run Code Online (Sandbox Code Playgroud)
在这种格式中,您将能够使用递归和列表处理技术来获得良好的结果.在前一个中,您将不得不使用数据库操作和/或全局变量.不是Prolog-ish.
对于您的编辑,问题在于您使用findall/3,这findall/3将为您提供您感兴趣的一个变量的所有结果,但不会精确导致这些结果的绑定.
尝试bagof/3改为:
bagof(S, W^worker( W, D, S ), R ).
Run Code Online (Sandbox Code Playgroud)
有关更多信息,请参阅此手册页(即使它是SWI,无论如何都是ISO Prolog谓词).
库(聚合)旨在解决这类问题.值得研究.
department_costs( D, T ) :- aggregate_all(sum(C), worker( _, D, C ), T).
Run Code Online (Sandbox Code Playgroud)
编辑
XSB具有" Tabling Aggregate Predicates ",可以让您有效地解决问题.