2015-05-20 2 views
1

Я хочу, чтобы преобразовать список в следующем формате:Prolog списки трансформирующих

C=[via(A,B,C,D),via(G,T,H,U),via(J,O,L,P)] 

в следующем:

F=[(C,D),(H,U),(L,P)] 

Буквы из F соответствуют буквам из C.

+4

Ваш образец это действительно странный термин , так как переменная C ** делится ** на себя (это циклический термин). Все ответы до сих пор просто игнорировали эту проблему, надеюсь, что вы это знаете ... – CapelliC

ответ

3

It может быть примерно таким:

transform([], []). 
transform([via(_, _, X, Y)|T)], [(X, Y)|TT) :- 
    transform(T, TT). 
2

несколько Prologs (как SWI-Prolog Я использую здесь, в библиотеке (apply)) имеют MapList:

1 ?- [user]. 
|: transform(via(_,_,C,D),(C,D)). 
(ctrl+D here) 
true. 

2 ?- X = [via(A,B,C,D),via(G,T,H,U),via(J,O,L,P)], maplist(transform,X,Y). 
X = [via(A, B, C, D), via(G, T, H, U), via(J, O, L, P)], 
Y = [ (C, D), (H, U), (L, P)]. 
2

Использование library(lambda) сводится к:

..., maplist(\via(_,_,X,Y)^(X,Y)^true, C, F), ... 
Смежные вопросы