我正在尝试在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)]
答案 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