2015-04-25 2 views
4

Я хочу проверить, добавляются ли все значения в список до некоторого значения. До сих пор, я написал следующее:Пролог: выяснить, равна ли сумма всех элементов списка N

list_sum([Head|Tail], Sum) :- 
    list_sum(Tail, Sum1), 
    Sum is Head + Sum1. 

Однако, когда я пытаюсь list_sum([1,2,3,4], 10) Пролог возвращается false. Может ли кто-нибудь помочь мне? Я не знаю, что я делаю неправильно.

+5

У вас есть только одно правило, а правило предполагает, что первый аргумент является списком, по меньшей мере, один элемент. Таким образом, он повторяется до тех пор, пока 'Tail' не станет пустым списком и не сработает (нет соответствующего правила). Вам нужно другое правило для случая, когда первым аргументом является пустой список. – lurker

+1

есть поддержка библиотеки: try '? - sum_list ([1,2,3,3], 6.3) .' – CapelliC

ответ

2

Используйте !

 
:- use_module (library(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. 
+2

другой прецедент:'? - [A, B, C] ins 1. sum, sum ([A, В, С, А], # =, 12), метка ([А, В, С]). ' – CapelliC

1

Мне кажется, что это довольно просто.

Попробуйте это:

list_sum([], 0). 
list_sum([Head|Tail], Sum):- 
    list_sum(Tail, Sum1), 
    Sum is Head + Sum1. 
Смежные вопросы