私は Prolog を初めて使用し、部分配列の最大問題のインスタンスを解決しようとしています。
次の非常にエレガントな C++ コードを取得しました。
int maxSubArray(vector<int> List)
{
int maxsofar = 0;
int maxendinghere = 0;
for (int i = 0; i < List.size(); i++)
{
maxendinghere = max(maxendinghere+List[i], 0);
maxsofar = max(maxsofar, maxendinghere);
}
return maxsofar;
}
そして、ここに私のプロローグコードがあります:
max(X,X,X).
max(X,Y,X) :- X>Y.
max(X,Y,Y) :- X<Y. %define max function
prev(L,T,H) :-
reverse(L,[H|T1]),
reverse(T,T1). %split L to H(last element) and T(the remaining list)
f([],0,0).
f(L,M,N) :-
f(L1,M1,N1),
prev(L,L1,E),
max(M1,N,M),
max(K,0,N),
K is N1+E.
から最大合計を取得しようとしますf(L,M,N)
。L
はリストでM
あり、結果です (最大合計は、C++ コードの変数「maxsofar」と同様です)。取得したいのN
は、C++ コードの「maxendinghere」としての中間変数です。L
以前のリストからの答えを得たいのですL1
が、変数の関係は C++ コードとまったく同じです。
ただし、次のクエリは機能しません。
?- f([1,2,3],X,Y).
is/2: Arguments are not sufficiently instantiated
どこに問題があるのかわからない。