Предположим, я хочу найти сумму списка в SWI-Prolog. Наиболее очевидным решением было бы что-то в форме:
sum([],0).
sum([H|T],S) :- sum(T, SofT), S is SofT + H.
и работает точно так, как ожидалось.
Однако из любопытства я решил перефразировать проблему, сказав, что нам нужно найти сумму, такую, что сумма хвоста равна общей сумме минус голова. Должно быть то же самое математически, хотя, возможно, немного менее естественно. Я написал это как
sum2([],0).
sum2([H|T],S) :- sum2(T, S-H).
Затем я выполняю свои запросы с очень простым тестовым примером и получаю результат:
?- sum([1], S).
S = 1.
?- sum2([1], S).
false.
SWI-Пролог, похоже, не смог найти решение для sum2, и мне интересно, почему это так. У меня действительно было внутреннее чувство, что все может пойти так, но я все еще не уверен, что на самом деле здесь происходит. Я запустил трассировщик, но не нашел вывод ужасно полезным. Я новичок в Прологе, поэтому я подозреваю, что вопрос может быть глупым или намекает на какое-то ужасное заблуждение с моей стороны.
Любые объяснения приветствуются, спасибо!