Участник списка, сумма предыдущих членов списка пролог - PullRequest
0 голосов
/ 06 мая 2018

Я хочу проверить, является ли член списка суммой предыдущих чисел.

Пример: [0,1,3,4,18,19]. Это ИСТИНА, потому что 0 + 1 + 3 = 4

sum_([],0).
sum_([X|XS],R):- suma(XS,R1), R is X + R1.


existsSum(L,[X|C]):-append(A,[X|B],L),
                    append(A,B,C),
                    sum_(C,X).

Я застрял здесь. Любая идея? Спасибо.

Ответы [ 2 ]

0 голосов
/ 07 мая 2018

Я думаю, что ваша проблема плохо сформулирована (или ваш пример не должен начинаться с нуля), потому что я думаю, что у вас в основном есть два способа обработки списка: либо вы обрабатываете весь список каждый раз (а ваш пример терпит неудачу, потому что 0 + 1 + 3 + 4 + 18! = 19) или вы останавливаетесь, как только ожидаемое значение совпадает с заголовком списка, и в этом случае [0] уже успешно выполнено.

В конце концов, способов обработки списка не так много. Вы должны принять решение, когда у вас есть элемент, и вы должны принять решение, когда у вас нет элементов. Предположим, что мы хотим добиться успеха, как только мы достигли значения, которое соответствует сумме на данный момент. Мы можем смоделировать это довольно просто так:

exists_sum(List) :- exists_sum(0, List).

exists_sum(RunningTotal, [RunningTotal|_]).
exists_sum(RunningTotal, [H|T]) :- 
  NewRunningTotal is RunningTotal + H,
  exists_sum(NewRunningTotal, T).

Обратите внимание, что с этой формулировкой [0|_] уже успешно. Также обратите внимание, что у меня нет пустого списка: если я дошел до конца списка, но уже не добился успеха, решения там нет, поэтому об этом нечего сказать.

Другая формулировка будет требовать обработки всего списка, что в основном будет заменой первого предложения exists_sum/2 следующим:

exists_sum(Total, [Total]).

Это не удастся объединить exists_sum(4, [4|_]), который вы описали в вопросе, где [0,1,3,4 ...] завершается успешно.

Могут быть и другие формулировки, более сложные, чем эти, но я их не вижу. Я действительно думаю, что есть только несколько способов сделать это, которые имеют смысл.

0 голосов
/ 06 мая 2018

Почему append(A,[X|B],L),append(A,B,C),sum_(C,X)? Таким образом, вы хотите, чтобы сумма всех элементов, кроме X, была равна X.

Не ясно, какими должны быть аргументы existsSum. Предположим, existsSum(InputList, SubList, Element):

existsSum(L,A,X) :- append(A,[X|_B],L), sum_(A,X).

На вашем примере вы получите следующие результаты:

?- existsSum([0,1,3,4,18,19], Sublist, Element).
Sublist = [],
Element = 0 ;
Sublist = [0, 1, 3],
Element = 4 ;
false.

Примечание: также [] и 0 - это решение из-за того, как вы определили предикат sum_, т. Е. Сумма [] равна 0.

Если вы измените предикат sum_ следующим образом:

sum_([X],X).
sum_([X|XS],R):- sum_(XS,R1),R is X + R1.

оно определено только для непустых списков, и в этом случае вы получите только один результат из вашего примера:

?- existsSum([0,1,3,4,18,19], Sublist, Element).
Sublist = [0, 1, 3],
Element = 4 ;
false.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...