我正在写一个谓词,它将连续的元素(所有负数或正数)分为不同的组 像
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>
有人可以帮忙吗?预先感谢。
答案 0 :(得分:1)
当您调用 same([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 和< strong>尾巴。
现在我们只需要检查乘积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]] ;