Используйте clpfd!
:- use_module (library(clpfd)).
Для вычисления суммы списка чисел просто использовать clpfd библиотеку предикат sum/3
:
?- sum ([1,2,3,4], #=, S). % Q: What is 1+2+3+4?
S = 10. % A: Sum is 10
?- sum([1,2,3,4], #=, 10). % Q: Does 1+2+3+4 equal 10?
true. % A: yes, it does
?- sum([1,2,3,4], #=, 11). % Q: Does 1+2+3+4 equal 11?
false. % A: no, it doesn't
Прецедент, показывающий преимущество использования clpfd вместо (is)/2
, предложенного @CapelliC:
?- [A,B,C] ins 1..sup, sum ([A,B,C,A], #=, 12), labeling ([], [A,B,C]).
A = B, B = 1, C = 9
; A = 1, B = 2, C = 8
; A = 1, B = 3, C = 7
; A = 1, B = 4, C = 6
; A = 1, B = C, C = 5
; A = 1, B = 6, C = 4
; A = 1, B = 7, C = 3
; A = 1, B = 8, C = 2
; A = C, B = 9, C = 1
; A = 2, B = 1, C = 7
; A = B, B = 2, C = 6
; A = 2, B = 3, C = 5
; A = 2, B = C, C = 4
; A = 2, B = 5, C = 3
; A = C, B = 6, C = 2
; A = 2, B = 7, C = 1
; A = 3, B = 1, C = 5
; A = 3, B = 2, C = 4
; A = B, B = C, C = 3
; A = 3, B = 4, C = 2
; A = 3, B = 5, C = 1
; A = 4, B = 1, C = 3
; A = 4, B = C, C = 2
; A = 4, B = 3, C = 1
; A = 5, B = C, C = 1.
У вас есть только одно правило, а правило предполагает, что первый аргумент является списком, по меньшей мере, один элемент. Таким образом, он повторяется до тех пор, пока 'Tail' не станет пустым списком и не сработает (нет соответствующего правила). Вам нужно другое правило для случая, когда первым аргументом является пустой список. – lurker
есть поддержка библиотеки: try '? - sum_list ([1,2,3,3], 6.3) .' – CapelliC