gpt4 book ai didi

prolog - 在Prolog中查找最大子列表

转载 作者:行者123 更新时间:2023-12-02 08:31:19 24 4
gpt4 key购买 nike

我是 Prolog 新手,正在尝试解决 maximum subarray problem 的实例.

我有以下相当优雅的 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;
}

这是我的 Prolog 代码:

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”。我想从原来的列表L1中得到L的答案,变量关系与C++代码相同。

但是,以下查询不起作用:

?- f([1,2,3],X,Y).
is/2: Arguments are not sufficiently instantiated

不知道问题出在哪里。

最佳答案

此答案显示 Prolog 端口 基于 :

:- use_module(library(clpfd)).

We define zs_maxmum/2 like so:

zs_maxmum(Zs, MSF) :-
zs_maxmum_(Zs, 0,_, 0,MSF).

zs_maxmum_([], _,_, MSF,MSF).
zs_maxmum_([Z|Zs], MEH0,MEH, MSF0,MSF) :-
max(0,MEH0+Z) #= MEH1,
max(MSF0,MEH1) #= MSF1,
zs_maxmum_(Zs, MEH1,MEH, MSF1,MSF).

示例查询:

?- zs_maxmum([-2,1,-3,4,-1,2,1,-5,4], Max).
Max = 6.

?- zs_maxmum([-2,3,4,-5,8,-12,100,-101,7], Max).
Max = 100.

几点说明:

  • 我们实际上并不是对数组进行操作,而是对列表进行操作。
  • 我们承认任意子列表,包括[]。目标 zs_maxmum([-2,-3,-4], 0) 成功。

关于prolog - 在Prolog中查找最大子列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27675467/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com