Предсказать арифметическую комбинацию (только + или -), чтобы найти результат из списка чисел - PullRequest
0 голосов
/ 22 сентября 2018

Я пытаюсь получить старое упражнение из моей школы, и я не могу понять, как его решить.Вот ожидаемый результат:

bC ([1,12,34,23,11], 23, Res).

Res = 1 + 11-12 + 23

Таким образом, bC/3 должен находить каждую комбинацию операции сложения или вычитания (третий аргумент) из списка чисел (первый аргумент), чтобы соответствовать результату (второй аргумент).

Я не могу найти способ начать решать эту проблему ... Если бы кто-то мог дать мне подсказку об этой проблеме, я был бы очень признателен.

ОБНОВЛЕНИЕ: Некоторые элементы списка могут бытьопущено.

1 Ответ

0 голосов
/ 22 сентября 2018

В качестве подсказки : вы можете стремиться создавать все выражения, исчерпывающе ища в пространстве выражений.Поскольку 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] , что выражениесуммирует до запрошенного значения.Если это так, предикат может быть успешным.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...