Пролог Сравнить элементы списка

Когда дан некоторый список ввода, я хочу создать новый список, и он должен:

  • Всегда добавляйте h перед новым списком
  • Сравните каждые два последовательных элемента списка ввода и, если они равны, добавьте y к новому списку, если нет, добавьте x.

Пример:

?- control([a,a,b,b],R).
R = [h,y,x,y].

Вот мой код до сих пор:

control([H,H|T],K,[K,0|T2]):- control([H|T],[K,0],T2).
control([H,J|T],K,[K,1|T2]):- control([J|T],[K,1],T2).
control([H],G,G).

Но это не работает правильно.

?-  control([a,a,b,b],[h],L).
L = [[h], 0, [[h], 0], 1, [[[h], 0], 1], 0, [[[...]|...], 1], 0] ;
L = [[h], 0, [[h], 0], 1, [[[h], 0], 1], 1, [[[...]|...], 1], 1] ;
L = [[h], 1, [[h], 1], 1, [[[h], 1], 1], 0, [[[...]|...], 1], 0] ;
L = [[h], 1, [[h], 1], 1, [[[h], 1], 1], 1, [[[...]|...], 1], 1] ;
false.

Как я могу сделать это правильно?

2 ответа

Вот еще один способ, которым вы могли бы взять... На основе if_/3 а также (=)/3 определять list_hxys/2:

list_hxys([E|Es], [h|Xs]) :-
   list_hxys_prev(Es, Xs, E).

list_hxys_prev([], [], _).
list_hxys_prev([E|Es], [X|Xs], E0) :-
   if_(E = E0, X = y, X = x),
   list_hxys_prev(Es, Xs, E).

Некоторые примеры запросов с использованием SICStus Prolog 4.3.2:

| ?- list_hxys([a,a,b,b], Xs).         % (query given by the OP)
Xs = [h,y,x,y] ? ;                     % expected answer
no
| ?- list_hxys(As, [h,y,x,y]).         % works the "other" way around, too
As = [_A,_A,_B,_B],
prolog:dif(_B,_A) ? ;                  % answer with residual goal dif/2
no

Давайте разберемся с этим:

% Two elements being read are the same -> add y
control([H,H|T],[y|R]) :- control([H|T],R).

% Two elements being read are not the same -> add x
control([H1,H2|T],[x|R]) :- H1 \== H2, control([H2|T],R).

В обоих пунктах мы делаем рекурсивный вызов со всеми, кроме первого проверенного элемента, и соответственно добавляем 'x' или 'y' к результату.

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

Другие вопросы по тегам