Моя задача: Найти количество разделов положительного целого числа в натуральном выражении. Например: 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)
?
В Prolog нет * функций *, но * предикатов *. Предикат преуспевает или терпит неудачу и не возвращает значение. Но вы можете создать переменный аргумент с результатом (* например. *, 'Pcount (5, 5, Result)'). Я не уверен, почему ты беспокоишься об этом. Это принципиально другой язык. Что касается простого сопоставления if-then-else, [этот вопрос] (http://stackoverflow.com/questions/29051798/whats-the-meaning-of-prologo-operator) может вас заинтересовать. – lurker
Я продолжаю забывать, что пролог Turbo/Visual позволяет '<=' вместо '= <'. : p – lurker
Прежде чем решить эту проблему, вы можете пройти базовый учебник по Prolog. Выражения, такие как 'pcount (Number, Limit-1) + pcount (Number-Limit, Limit)' arent будут делать вообще то, что вы думаете, что это будет делать. – lurker