Кортеж к списку в прологе - PullRequest
       13

Кортеж к списку в прологе

0 голосов
/ 23 сентября 2018

В последнее время я делаю программу, и мне нужно преобразовать кортеж в список.

Кортежи выглядят так: [(1,[1,2,3,4]), (1,[2,3,4,5]), ...]

И то, что я хочу, это список: [(1,2,3,4), (2,3,4,5), ...]

Есть ли способ, которым я могу это сделать?

1 Ответ

0 голосов
/ 24 сентября 2018

В Прологе (1, 4, 2, 5) - синтаксический сахар для (1, (4, (2, 5))), точно так же, как [1, 4, 2, 5] - синтаксический сахар для [1|[4|[2|[5|[]]]]] (однако обратите внимание, что список заканчивается пустым списком [], тогда как для кортежа,это заканчивается (2, 5)).

list_tuple([A, B], (A, B)).
list_tuple([A|T], (A, B)) :-
    list_tuple(T, B).

Итак, мы можем написать предикат для распаковки списка из 2-х кортежей и преобразования его в кортеж:

conv((_, L), R) :-
    list_tuple(L, R).

и мы можем использовать maplist/3 для выполнения преобразования по всему списку:

convlist(As, Bs) :-
    maplist(conv, As, Bs).

В этом случае получается:

?- convlist([(1,[1,2,3,4]), (1,[2,3,4,5])], R).
R = [(1, 2, 3, 4),  (2, 3, 4, 5)] ;
false.

Однако в Прологе нет кортежейочень часто, поэтому я не понимаю, почему вы не придерживаетесь самого списка.

...