Пролог (аргументы не созданы) - PullRequest
0 голосов
/ 16 марта 2019

Я пишу предикат, который разделяет последовательные элементы (все отрицательные или положительные) на разные группы, такие как

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>
* 1006Может ли кто-нибудь помочь?Заранее спасибо.

1 Ответ

1 голос
/ 16 марта 2019

Когда вы вызываете 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]] ;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...