gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:40:14 24 4
gpt4 key购买 nike

此谓词的输入是 S、一个整数列表 I 和一个整数列表 T。假设 S 和 I 都已完全实例化,但不是 T。该函数将 I 中的第一个元素与T 中的第一个元素然后将其与 I 中的第二个元素相乘并乘以 [...] 你明白了。但是,我遇到的困难是在 T 未实例化时使该函数成功。我不想使用 use_module(library(clpfd)) 尽管它可能更容易。作为 helper ,我已经有了可以正确繁殖的东西。为了摆脱“未实例化的变量”问题,我想我让一个变量 = S div head of I,所以我会实例化一个新变量,我会为列表 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) :-

最佳答案

我天真的解决方案:

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 .
  • 限于非负数。
  • 穷尽所有的可能性,可以是相当多的。
  • 可能不是最有效的实现方式......

关于Prolog - 将列表与未实例化的列表相乘,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29361220/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com