序言。打破自然项数量的整数
Prolog. Break integer in the amount of natural terms
我的任务是:在自然项的数量中求一个正整数的划分数。
例如: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)
?
您所拥有的非常接近正确,但需要更多约束。现有子句递归为 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).
我的任务是:在自然项的数量中求一个正整数的划分数。 例如: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)
?
您所拥有的非常接近正确,但需要更多约束。现有子句递归为 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).