Prolog-一个查找一组和特定值之和的值的程序

Prolog-一个查找一组和特定值之和的值的程序,prolog,Prolog,我想制作一个接收3个参数的程序: 例如,清单1中的硬币:[5,2,1] 我们想要得到的价值总和 总计为该特定值的硬币列表-此列表是列表1的子列表 (允许重复相同的元素,例如:要达到4,我们可以使用列表[2,2]) 因此,程序应该做两件事: change([5,2,1],4[2,2])将返回Yes(原因2+2=4) change([5,2],6,硬币)将返回Coins=[2,2,2] 这是我的尝试: change(_,0,Res). change([X|Xs],Sum,Cs):- Sum <

我想制作一个接收3个参数的程序:

  • 例如,清单1中的硬币:
    [5,2,1]
  • 我们想要得到的价值总和
  • 总计为该特定值的硬币列表-此列表是列表1的子列表 (允许重复相同的元素,例如:要达到4,我们可以使用列表
    [2,2]
  • 因此,程序应该做两件事:

  • change([5,2,1],4[2,2])
    将返回
    Yes
    (原因2+2=4)

  • change([5,2],6,硬币)
    将返回
    Coins=[2,2,2]

  • 这是我的尝试:

    change(_,0,Res).
    change([X|Xs],Sum,Cs):- Sum <X, change(Xs,Sum,Cs).
    change([X|Y],Sum,[X|Res]):- Sum>=X, Sum2 is Sum - X, change([X|Y],Sum2,Res).
    
    change(\u0,Res)。
    变化([X | Xs],Sum,Cs):-Sum=X,Sum2是Sum-X,变化([X | Y],Sum2,Res)。
    
    对于第一条规则的最后一个参数,您需要将
    Res
    更改为
    []
    。此外,应在同一规则中添加切割运算符,以避免多次获得相同的结果

    change(_, 0, []):-!.
    change([X|Y], Sum, [X|Res]):-
        Sum >= X, !, % remove the cut operator to get all solutions
        Sum2 is Sum - X,
        change([X|Y], Sum2, Res).
    change([_|Xs],Sum,Cs):-
        change(Xs, Sum, Cs).
    

    可以使用member/2从列表中“猜测”元素

    只要小心终止

    change(_,0,[]).
    change(Coins,Sum,[C|Cs]) :-
       Sum > 0, member(C, Coins), Rest is Sum-C, change(Coins,Rest,Cs).
    

    你的问题到底是什么?第一条规则应该是
    change(uu,0,[])。
    []
    而不是
    Res
    )。。它不像我做的那样工作。你为什么要把它改成[]?我不这么认为。一旦你得到了获得值所需的集合,你应该得到0。因为对于零和,你不需要硬币(一个空的硬币列表)。当我运行它时,我得到了一个语法错误。。。您不能假设列表已排序。我确信语法错误不是因为答案中的代码。但是你需要所有的解决方案,还是只需要一个有最大价值的解决方案?那么它在你的电脑上运行的很好?我需要它来给出第一个答案。。不一定是大硬币..我修正了语法错误。。。但是当我运行change({2,5},4,{2,2})时。这是因为Prolog中的列表是用方括号括起来的。尝试
    更改([2,5],4[2,2])。
    应该可以。