此谓词的输入是S,整数列表I和整数列表T.假设S和I都是完全实例化的,但不是T.该函数将I中的第一个元素与T中的第一个元素然后将它与I中的第二个元素相加,乘以[...]得到的想法。然而,我正在进行的斗争是在T未实例化时使该功能成功。即使可能更容易,我也不想使用use_module(library(clpfd))
。
作为助手,我已经有了正确的东西。为了摆脱“未实例化的变量”问题,我想我让变量= S div我的头部,所以我实例化一个新的变量,我会为列表I中的每个项目执行此操作。然后我会生成所有排列使得列表中项目的乘积总和为S
mult_prod(A, B, S) :-
sum_prod(A, B, 0, S).
mult_prod([A | As], [B | Bs], Accum, S) :-
Accum1 is Accum + A*B,
mult_prod(As, Bs, Accum1, S).
mult_prod([], [], Accum, Accum).
multSum(S, I, T) :-
答案 0 :(得分:1)
我天真的解决方案:
multSum(0, [], []).
multSum(S, [I | Is], [T | Ts]) :-
between(0, S, T),
S1 is S - I * T,
multSum(S1, Is, Ts).
示例输出:
?- multSum(42, [6, 7, 8, 9], T).
T = [0, 0, 3, 2] ;
T = [0, 1, 1, 3] ;
T = [0, 6, 0, 0] ;
T = [1, 0, 0, 4] ;
T = [1, 4, 1, 0] ;
T = [2, 2, 2, 0] ;
T = [2, 3, 0, 1] ;
T = [3, 0, 3, 0] ;
T = [3, 1, 1, 1] ;
T = [4, 0, 0, 2] ;
T = [7, 0, 0, 0] ;
false.
潜在问题: