在Prolog中将结果存储和显示为列表

时间:2017-05-30 16:33:36

标签: list prolog

我正在尝试在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 个答案:

答案 0 :(得分:2)

这是一个简单的实现:

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)].

请注意,为了将结果存储在列表中并返回列表,您需要添加上述其他参数。

答案 1 :(得分:2)

DCG可以很好地描述列表。至于调用谓词,我会建议一个反映它的关系性质的名称,比如list_tagged/2

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([a,b,c],T).
T = [tag(1,a),tag(2,b),tag(3,c)]

请注意,谓词也在另一个方向:

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