Пролог список списка номер с условием - PullRequest
0 голосов
/ 01 февраля 2019

Я изучаю язык пролога, и у меня есть проблема, касающаяся этой проблемы.

Я уже создал программу, которая, получив число N, возвращает список с элементами между 0 иN:

list2val(N,L):- list2val(0,N,L).

list2val(N,N,[N]).
list2val(C,N,[C|T]):- 
    C<N,
    N1 is C+1,
    list2val(N1,N,T).

?- list2val(5,X).
X = [0,1,2,3,4,5]

Теперь я пытаюсь дать расширение, которое при наличии списка возвращает список списков, в котором каждый список равен list2val, только если следующее число больше текущегочисло.В этом случае:

?- newFuction([1,5,2,3,9],L). 
L = [[0,1],[0,1,2,],[0,1,2,3]]

Мой код такой, но что-то не так:

array(X):- array(X,_L).
array([],_L).

array([H|[T|Ts]],L1):- 
    H<T, 
    list2val(H,L2),
    array([T|Ts],[L1|[L2]]).
array([T|Ts],L1).

Может быть, это может быть слишком сложно понять, но используя список L = [1,5,2,3,9] я делаю тешаги:

  • проверка 1 <5, поэтому я создаю 1 list2val до 1. в этом случае [0,1] </li>
  • проверка 5 <2 я ничего не создаю. </li>
  • check 2 <3 я создаю list2val из 2 ... [0,1,2] </li>
  • и так далее ...

Я не хочу использоватьстандартные предикаты, реализованные со стандартными терминами.

1 Ответ

0 голосов
/ 01 февраля 2019

Решением вашей проблемы может быть:

list2val(N,L):- list2val(0,N,L).

list2val(N,N,[N]):- !.
list2val(C,N,[C|T]):- 
    C<N,
    N1 is C+1,
list2val(N1,N,T).

simulate([_],[]).
simulate([A,B|T],[H|T1]):-
    ( A < B ->
        list2val(A,H),
        simulate([B|T],T1);
        simulate([B|T],[H|T1])
    ).

Используя предикат вроде simulate/2, вы можете решить вашу проблему: он сравнивает два числа в списке и затем создает новый список в случае, еслисостояние удовлетворено.

?- simulate([1,5,2,3,9],LO).
LO = [[0, 1], [0, 1, 2], [0, 1, 2, 3]]
false
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...