错误:> / 2:参数未充分实例化

时间:2015-11-24 17:01:52

标签: prolog

我想获得偶数数字的最大序列的长度,但是我得到了这个错误ERROR: >/2: Arguments are not sufficiently instantiated。我在线阅读了一些内容,但我无法理解。

示例:

max([2,4,6,7,4,8],R).
R=3

这是我的代码:

    max([H|T], L) :- max1(H, 1, T, L).

    max1(H,_, [],0):-
        H mod 2 =:=1.
    max1(H, N, [], N):-
        H mod 2 =:=0.
    max1(X, N, [H|T], L) :-
        X mod 2 =:=0,
        M is N+1,
        max1(H, M, T, L).
    max1(X,N,[H|T],L):-
        X mod 2 =:=1,
        M>N,
        max1(H, 1, T, M).
    max1(X,N,[H|T],L):-
        X mod 2 =:=1,
        N>M,
        max1(H,1,T,N).

1 个答案:

答案 0 :(得分:1)

在你的上一个谓语max1中,M并不意味着什么。在上面的谓词中,您遇到了同样的问题,因为在您比较M>N时,M也是未知的。

如果立即使用X,我也不明白为什么要将您的列表与[H|T]分离。这简化了程序。 这是一个与累加器一起使用的解决方案。

max(L, R) :- 
maxAcc(L, 0, 0, R). % list, currentBest, currentTot, Acc

maxAcc([],_, Best, Best).
maxAcc([H|T],Cur, Best, Acc) :-
    H mod 2 =:=0,
    CurN is Cur+1,
    BestNext is max(CurN,Best),
    maxAcc(T, CurN, BestNext, Acc).
maxAcc([H|T],Cur, Best, Acc) :-
    H mod 2 =:=1,
    BestNext is max(Cur,Best),
    maxAcc(T, 0, BestNext, Acc).