2017-05-30 10 views
2

Ich versuche, eine index- und wertbasierte Paarausgabe in Prolog zu erhalten. Unten ist mein Code:Ergebnis als Liste in Prolog speichern und anzeigen

tagit0(L) :-tagit0(L, 1). 

tagit0([], _) :- nl. 
tagit0([H|T], N) :- 
    N1 is N + 1, 
    format('tag (~w, ~w), ', [N1, H]), 
    tagit0(T, N1). 

Ausführen dieses: ?- tagit0([a,b,c],0).

Gibt: tag (1, a), tag (2, b), tag (3, c),

Aber ich für einige Ausgang suchen, die in einer Liste gespeichert und angezeigt Like:

L = [tag (1, a), tag (2, b), tag (3, c)]

+2

'tagit0 (Liste, Ergebnis): - Finden (Tag (N, I), nth1 (N, Liste, I), Ergebnis) .' –

Antwort

2

H ere ist eine einfache Implementierung:

tagit0(L,OutL) :-tagit0(L, 0, OutL). 

tagit0([], _,[]). 
tagit0([H|T], N,[tag(N1, H)|T1]) :- 
    N1 is N + 1, 
    tagit0(T, N1,T1). 

Beispiel:

?- tagit0([a,b,c],L). 
L = [tag(1, a), tag(2, b), tag(3, c)]. 

Beachten Sie, dass, um die Ergebnisse in einer Liste zu speichern und gibt die Liste, die Sie wie oben einen anderen Parameter hinzufügen müssen.

2

Listen können sehr gut von DCGs beschrieben werden. Wie für die Berufung Prädikat, würde ich einen Namen vorschlagen, es ist relationale Natur widerspiegelt, sagen list_tagged/2:

?- list_tagged([a,b,c],T). 
T = [tag(1,a),tag(2,b),tag(3,c)] 

Beachten Sie, dass das Prädikat in auch funktioniert:

list_tagged(L,T) :- 
    phrase(tagged(L,0),T). % the DCG tagged//2 describes T 

tagged([],_) -->   % in the empty list 
    [].     % there's nothing to be tagged 
tagged([H|T],N0) -->  % the head of a non-empty list 
    {N1 is N0+1}, 
    [tag(N1,H)],   % is tagged with N1 
    tagged(T,N1).   % the tail is tagged as well 

Ihr Beispiel Abfrage das gewünschte Ergebnis liefert die andere Richtung:

?- list_tagged(L,[tag(1,a),tag(2,b),tag(3,c)]). 
L = [a,b,c] ? ; 
no