2016-12-09 10 views
1

Я использую GNU-Prolog пытается написать программу, которая принимает N и M целые положительные числа и суммы всех чисел между N и M, в том числе и NM.Пролог Найти сумму целых чисел между двумя целыми числами

мой код:

findnum(N, N, M).  
findnum(N, M, Res) :- N1 is N+1, N1 < M, findnum(N1, M, Res), Res is N1 + M. 

Выполнение возвращает только «нет» без ответа, любая идея, что проблема?

ответ

1

Try с

findnum(N, N, N).  

findnum(N, M, Res) :- 
    N1 is N+1, 
    N < M, 
    findnum(N1, M, R0), 
    Res is R0 + N. 

Ваш первый пункт

findnum(N, N, M). 

является неправильным, потому вы должны установить (унифицировать) M до величины; и если вы хотите суммировать числа от N до N, сумма N, так

findnum(N, N, N). 

Идея второго раздела является просуммировать N на сумму от N+1 до M; Я вижу три ошибки в своей реализации:

1) вы должны вызвать пункт терминала (findnum(N, N, N)), так что неправильно охранник N1 < M, потому что вы должны вызвать терминальное положение, когда N1 равно M; правильный охранник N < M или N1 <= M

2) если ваш рекурсивный вызов findnum/3 использования, для третьего аргумента, то тот же переменного (Res), вы не можете добавить N, так что вы должны позвонить с другим переменным: R0 в моем примере

3) Res is N1 + M неправ; правильная версия: Res is R0 + N; текущее число (N) плюс сумма от N+1 до M.

1

Я понимаю, что это, вероятно, не полезно, но я просто должен сказать это.

sums_upto(N, Sums) :- succ(N, N1), Sums is N * N1/2. 

findnum(N, M, Total) :- 
    N < M, 
    sums_upto(N, NSum), 
    sums_upto(M, MSum), 
    Total is N + MSum - NSum. 
+0

Это единственный разумный подход к решению этого вопроса. –

Смежные вопросы