Я пытаюсь написать программу на Прологе, которая делает две вещи:
- Принимает два аргумента, целое число и список целых чисел.
- Удовлетворительно, если изменение для первого аргумента может быть сделано из некоторой комбинации элементов из второго
Я придумал решение этой проблемы, которое позволяет унифицировать правило изменения для создания фактов как таковых:
coin(quarter, 25).
coin(dime,10).
coin(nickel,5).
coin(penny,1).
change(0, []).
change(A, [(C, Num)|L]) :-
coin(C, V),
A >= V,
Num is floor(A / V),
B is A mod V,
change(B, L).
Кроме того, если вы передадите что-то вроде change(27,L) интерпретатору, он сгенерирует все возможные комбинации четвертаков, десятицентовиков, пятицентовиков и пенни, которые можно использовать для внесения сдачи, например:
?- change(27,L).
L = [(quarter, 1), (penny, 2)] ;
L = [(dime, 2), (nickel, 1), (penny, 2)] ;
L = [(dime, 2), (penny, 7)] ;
L = [(nickel, 5), (penny, 2)] ;
L = [(penny, 27)] ;
false.
Однако у меня возникли проблемы с тем, как это можно решить, просто передав список валют, например [25,10,5,1], в сдачу, сделав вызов похожим на изменение (27, [25,10,5, 1], л). Возможно ли это, и если да, то как это можно сделать?
Coinage
), например[quarter=25, dime=10, nickel=5, penny=1]
, в качестве аргумента, а затем просто изменитьcoin(C, V)
наmember(C=V, Coinage)
. - person Daniel Lyons   schedule 15.04.2019[ (10, 2), (5, 1), (1, 2) ]
, но[ (10, 1), (5, 3), (1, 2) ]
тоже решение... - person Will Ness   schedule 17.05.2020