В качестве подсказки : вы можете стремиться создавать все выражения, исчерпывающе ища в пространстве выражений.Поскольку X - (Y - Z)
это просто X - Y + Z
, это хорошая новость, поскольку мы можем ограничить нас леворекурсивными выражениями, такими как:
makepm([], ExpI, ExpI).
makepm([H|T], ExpI, ExpO) :-
makepm(T, +(ExpI, H), ExpO).
makepm([H|T], ExpI, ExpO) :-
makepm(T, -(ExpI, H), ExpO).
Если в качестве первого элемента мы примем 1
и добавляем остальную часть списка в makepm/3
, получаем:
?- makepm([12,34,23,11], 1, F).
F = 1+12+34+23+11 ;
F = 1+12+34+23-11 ;
F = 1+12+34-23+11 ;
F = 1+12+34-23-11 ;
F = 1+12-34+23+11 ;
F = 1+12-34+23-11 ;
F = 1+12-34-23+11 ;
F = 1+12-34-23-11 ;
F = 1-12+34+23+11 ;
F = 1-12+34+23-11 ;
F = 1-12+34-23+11 ;
F = 1-12+34-23-11 ;
F = 1-12-34+23+11 ;
F = 1-12-34+23-11 ;
F = 1-12-34-23+11 ;
F = 1-12-34-23-11.
Что еще нужно сделать : вопрос не совсем ясен по поводу фактаесли числа можно опустить, если это так, то вы должны написать предикат, который сначала выбирает подмножество чисел.Затем мы можем исчерпывающе перечислить все выражения, которые мы создаем с помощью makepm/3
, а затем нам нужно проверить, например, с помощью is/2
[swi-doc] , что выражениесуммирует до запрошенного значения.Если это так, предикат может быть успешным.