Prolog - 一个程序,它找到一组总和为特定值的值

时间:2014-06-19 15:36:56

标签: prolog

我想创建一个接收3个参数的程序:

  1. list1 of coins例如:[5,2,1]
  2. 价值 - 我们想要的总和
  3. 与该特定值相加的硬币列表 - 此列表是list1的子列表 (它允许重复相同的元素,例如:达到4,我们可以列出[2,2]
  4. 所以程序应该做两件事:

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

    2. change([5,2],6,Coins)将返回Coins = [2,2,2]

    3. 这是我的尝试:

      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).
      

2 个答案:

答案 0 :(得分:1)

您需要将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).

答案 1 :(得分:1)

'猜测'列表中的元素可以使用member / 2完成。

只需注意终止

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