2015-03-14 1 views
2

Моя задача: Найти количество разделов положительного целого числа в натуральном выражении. Например: N = 5. Ответ равен 7, потому что 5: {1,1,1,1,1}, {2,1,1,1}, {2,2,1}, {3,1,1}, {3,2} , {4,1}, {5}Пролог. Разбить целое число в натуральном выражении

Я написал решение на JS:

function pcount(number, limit) { 
if (limit === 0) { 
    if (number === 0) { 
    return 1; 
    } 
    return 0; 
} 

if (limit <= number) { 
    return pcount(number, limit - 1) + pcount(number - limit, limit); 
} 

return pcount(number, number); 
} 

но теперь я пытаюсь написать его с помощью Prolog, но есть некоторые трудности с pcount(number, limit - 1) + pcount(number - limit, limit); заявления.

Вот мой код:

PREDICATES 
    check(integer,integer,integer) 
    check(integer,integer) 
CLAUSES 
    check(0,0,Result):- 
     Result=1. 
    check(_,0,Result):- 
     Result=0. 
    check(Number,Limit,Result):- 
     Limit<=Number,!, 
     NN=Limit-1, 
     RR=Number-Limit, 
     check(Number,NN,Result1), 
     check(RR,Limit,Result2), 
     Result=Result1+Result2. 
    check(A,B):- 
     check(A,B,X), 
     write(X). 

    %check(number, limit - 1) + check(number - limit, limit); 

GOAL 
    check(2,2). 

, но он не работает. Ошибка в этом предикате: check(Number,Limit,Result). Как объединить результаты двух вызовов предикатов: check(Number, Limit-1)+check(Number-Limit,Limit)?

+0

В Prolog нет * функций *, но * предикатов *. Предикат преуспевает или терпит неудачу и не возвращает значение. Но вы можете создать переменный аргумент с результатом (* например. *, 'Pcount (5, 5, Result)'). Я не уверен, почему ты беспокоишься об этом. Это принципиально другой язык. Что касается простого сопоставления if-then-else, [этот вопрос] (http://stackoverflow.com/questions/29051798/whats-the-meaning-of-prologo-operator) может вас заинтересовать. – lurker

+0

Я продолжаю забывать, что пролог Turbo/Visual позволяет '<=' вместо '= <'. : p – lurker

+0

Прежде чем решить эту проблему, вы можете пройти базовый учебник по Prolog. Выражения, такие как 'pcount (Number, Limit-1) + pcount (Number-Limit, Limit)' arent будут делать вообще то, что вы думаете, что это будет делать. – lurker

ответ

1

То, что у вас есть, очень близко к правилу, но требует немного большего ограничения. Существующее предложение рекурсирует на отрицательные значения Limit. Вот небольшое обновление, которое должно решить эту проблему вместе с некоторыми незначительными изменениями:

check(0, 0, 1). 
check(N, 0, 0) :- 
    N > 0.     % Added constraint N > 0 
          % avoids overlap with first clause 
check(Number, Limit, Result):- 
    Limit > 0,    % Added constraint Limit > 0 avoids overlap 
          % with first clause and negative values 
    Limit <= Number, !, 
    NN = Limit - 1, 
    RR = Number - Limit, 
    check(Number, NN, Result1), 
    check(RR, Limit, Result2), 
    Result = Result1 + Result2. 
check(Number, Limit, Result) :- % Case were Limit > Number as in your 
    Limit > Number,    % original non-Prolog code 
    check(Number, Number, Result). 

check(A, B):- 
    check(A, B, X), 
    write(X). 
+0

wow, ty! Оно работает. Я полностью забыл о последнем условии 'pcount (number, number)'. Благодарим вас за помощь, советы и терпение. – HelterShelter

+0

@HelterShelter Я рад, что это сработало для вас. :) Вы могли бы принять это как ответ? – lurker

+0

О, извините, я новичок в stackoverflow и забыл об этом. Я отметил это – HelterShelter