Когда вы вызываете 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 неизвестен.
[EDIT]
Вы должны начать работу с конца списка, поэтому нам нужны три вещи, что мы делаем, когда достигаемконец, что мы делаем после, и как мы достигаем конца списка!
Когда есть только один элемент, это легко:
same([X], [[X]]).
Теперь, когда у нас есть началоэто просто, мы работаем с этой конфигурацией:
то же самое ([H | T], [[X | T1] | Tail]).
С то же самое ([X], [[X]]) , T инстанцируется с [] , то же самое для T1 и Tail .
Теперь нам просто нужно проверить произведение H * X. Если оно больше 0, мы ставим H в заголовок [X | T1] Например, [H, X | T1] * 1037.*, если нет, мы создаем новый список [[H], [X | T1] | Хвост] .
Последнее, что нужно, если достичь конца списка.Отказ, если наш друг
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]] ;