Prolog(参数未实例化)

问题描述 投票:0回答:1

我正在编写一个谓词,将连续的元素(所有的负面或正面)分成不同的组

same([1,2,3,-1,-3,-2,4,5,6],X).
would output [[1,2,3],[-1,-3,-2],[4,5,6]]

我的代码在下面(只有正面部分):

same([],[]).  
same([H|T],[[X,Y,H]|Tail]):-
   X >= 0,
   H >= 0,
   same(T,[[X,Y]|Tail]).

Error message:ERROR: Arguments are not sufficiently instantiated

ERROR: In:
ERROR:    [9] _4652>=0
ERROR:    [8] sign_runs([2,2|...],[_4696,_4702|...]) at /Users/filepath:40
ERROR:    [7] <user>

有人可以帮忙吗?提前致谢。

list prolog
1个回答
1
投票

当你调用它时([1,2,3,-1,-3,-2,4,5,6],X)。第二个条款被称为。 H用1,T与[2,3,-1,-3,-2,4,5,6]进行实例化。

所以当调用X> = 0时,X是未知的。

[编辑]

你必须从列表末尾开始工作,所以我们需要三件事,当我们到达终点时我们会做什么,我们做什么,以及我们如何到达列表的末尾!

当只有一个元素时,很容易:

same([X], [[X]]).

现在当我们开始它很简单时,我们使用这个配置:

相同([H | T],[[X | T1] | Tail])。

从相同的([X],[[X]]),T用[],同时为T1和Tail进行实例化。

现在我们只需要检查乘积H * X如果它大于0,我们将H放在[X | T1]的头部,例如[H,X | T1],如果不是,我们创建一个新列表[[H],[X | T1] | Tail]。

如果要到达列表的末尾,最后一件事。如果你的朋友,递归

same([H|T], Tail) :-
   same(T, Tail1),
   ...

现在我们可以编写完整的代码:

same([X],[[X]]).

same([H|T], Tail):-
    same(T, [[X| T1]|Tail1]),
    /* Bad answer for [1,2,0,-5] 
    ( H*X >= 0
    ->  Tail = [[H, X | T1] | Tail1]
    ;   Tail =  [[H], [X|T1] | Tail1]).
   */
   (   H >= 0
   ->  (X >= 0
       ->  Tail = [[H, X | T1] | Tail1]
       ;   Tail =  [[H], [X|T1] | Tail1])
   ;   (X < 0
       ->  Tail = [[H, X | T1] | Tail1]
       ;   Tail =  [[H], [X|T1] | Tail1])).

我们得到:

  ?- same([1,2,3,-1,-3,-2,4,5,6],X).
X = [[1, 2, 3], [-1, -3, -2], [4, 5, 6]] ;
© www.soinside.com 2019 - 2024. All rights reserved.