Используя maplist/4
, вся итерация скрыта, и вы должны думать только о деконструкции одной пары.
%zip(?FirstList, ?SecondList, ?PairList)
zip(Fst, Snd, Pair) :- maplist(pair, Fst, Snd, Pair).
%pair(?First, ?Second, ?Pair)
pair(Fst, Snd, [Fst, Snd]).
Используйте это так:
?- zip(List1, List2, [['Test1', 'US'], ['Test1', 'France'], ['Test2', 'German']]).
List1 = ['Test1', 'Test1', 'Test2'],
List2 = ['US', 'France', 'German'].
Обратите внимание, что это расширенное решение. Во-первых, знакомство с основными рекурсивными решениями (представленными другими ответами) действительно полезно, и я рекомендую его. Без хорошего понимания рекурсии, Пролог - просто один большой ад. На самом деле maplist
тоже использует рекурсию, она просто скрыта от вызывающей стороны.
Еще одна вещь, которую нужно изучить, - это как работают термины Пролог и объединение.
- Использование
append
здесь совершенно не нужно. Кроме того, это вредно как с точки зрения производительности, так и с точки зрения читаемости.
Пары лучше представить с помощью функтора, например, пара ['Test1', 'US']
становится pair('Test1', 'US')
. Среди других преимуществ, сложнее случайно смешать пары и тройки. Использование функторов несколько похоже на использование типов в других языках.
SWI-Prolog использует дефис-минус в качестве функтора для пар . Благодаря объявлению оператора дефис-минус также может использоваться в инфиксной нотации. Например. пара ['Test1', 'US']
становится 'Test1'-'US'
. Инфиксная нотация является просто синтаксическим сахаром для обычной префиксной нотации, используемой для других функторов (т.е. 'Test1'-'US' == -('Test1', 'US')
).
Наконец, нотация foreach ... do
, которую вы пытались использовать, выглядит как циклическая конструкция из ECLiPSe , которая является производным от Prolog. SWI-Prolog не поддерживает этот синтаксис.