Prolog - 将列表与未实例化的列表相乘

时间:2015-03-31 05:30:48

标签: prolog

此谓词的输入是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) :- 

1 个答案:

答案 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.

潜在问题:

  • 这太简单了;我一定忽略了你的问题,或者完全误解了它。
  • 仅在SWI Prolog中测试过;依赖于between/3。如有必要,您可以implement this predicate yourself
  • 仅限于非负数。
  • 彻底地产生所有可能性,这可能是相当多的。
  • 可能不是最有效的实施......