2017-05-30 14 views
2

Prologでインデックスと値ベースのペア出力を取得しようとしています。以下は私のコードです:この実行結果をプロローグのリストとして保存して表示

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

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

?- tagit0([a,b,c],0).

は与える:tag (1, a), tag (2, b), tag (3, c),

が、私はリストに保存されているなど を表示されているいくつかの出力を探しています:

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

+2

tagit0(リスト、結果):findallタグ(N、I)、nth1(N、リスト、I)、結果)。 –

答えて

2

H

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

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

例:

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

注リストに結果を保存し、上記のように別のパラメータを追加する必要がリストを返すために、そのEREは、単純な実装です。

2

リストはDCGによって非常にうまく記述できます。呼び出し述語に関しては、私はそれは、リレーショナル自然の反映名前を示唆し、list_tagged/2言う:述語もで動作していることを

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

注:

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 

あなたのクエリの例は、望ましい結果得他の方向:

?- list_tagged(L,[tag(1,a),tag(2,b),tag(3,c)]). 
L = [a,b,c] ? ; 
no 
関連する問題