我想创建一个接收3个参数的程序:
[5,2,1]
[2,2]
)所以程序应该做两件事:
change([5,2,1],4,[2,2])
将返回Yes
(因为2 + 2 = 4)
change([5,2],6,Coins)
将返回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).
答案 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).