Prolog如何指定成对打印格式

Prolog如何指定成对打印格式,prolog,Prolog,配对数据很好使用,但我发现很难呈现。我问如何完成打印一组向量,使键和值以令人愉快的方式排列。在对值中引入零会有所帮助。样本数据: [1-7,2-43,3-56,4-87,5-110,6-80,7-15] [1-1837,2-1873,3-1911,4-1946,5-1975,6-1994,7-2005] 我试图找出SWI格式的谓词的用法;但是不能。 然后我想进行内联实验; 格式('~n~w~w~n',['Pairs:',1-246,1-2,'EOL']) 最终结果应处理KK-VV表中的

配对数据很好使用,但我发现很难呈现。我问如何完成打印一组向量,使键和值以令人愉快的方式排列。在对值中引入零会有所帮助。样本数据:

  [1-7,2-43,3-56,4-87,5-110,6-80,7-15]
  [1-1837,2-1873,3-1911,4-1946,5-1975,6-1994,7-2005]
我试图找出SWI格式的谓词的用法;但是不能。 然后我想进行内联实验; 格式('~n~w~w~n',['Pairs:',1-246,1-2,'EOL'])

最终结果应处理KK-VV表中的成对数据:

01-0007 02-0043 03-0056 04-0087 05-0110 06-0080 07-0015 398 People 7 Gens.
01-1837 02-1873 03-1911 04-1946 05-1975 06-1994 07-2005 Spanning 168 Years 
最后答覆:

fpair(A-B) :- format('~`0t~d~2|-~`0t~d~7| ', [A,B])
applist(_,[]). applist(P,[X|L]) :- Q =.. [P,X],call(Q),applist(P,L).    
dojustone(X):- format('~@ ',[fpair(X)]).    
dolist(X):- applist(dolist,X).

对于复杂格式,我使用@说明符,它允许输出特定的术语。比如说

?- format('~s~n~@~n~@~n~w~n', ['Pairs: ',fpair(1-246),fpair(1-2), '    EOL']).
也就是说,fpair/1是一个用户谓词,由@调用,用于捕获其输出

为了获得固定宽度的字段,我使用制表符规范,这是由两个共同工作的说明符构建的。最后,要使用0作为前缀,我将使用

fpair(A-B) :-
    format('~`0t~d~6| ~`0t~d~12|', [A,B]).

在事先不知道最大位数的情况下,我们必须进行猜测。我在这里使用了6。

我认为格式控制序列
~`
特定于SWI Prolog。至少它不在GNU序言中。这可能值得注意,因为不清楚OP使用的是什么版本的Prolog;现在我只需要找出如何将它应用到一个成对的列表中,这应该是一个直接的Prolog问题,但我仍然对嵌套感到困惑。。。回想起来,更好的问题描述应该包括一个由N对组成的可变元素列表L,每对都格式化为2位键和4位值。@是解决方案的关键。fpair(A-B):-格式(“~
0t~d~2 | ~
0t~d~7 |”,[A,B])。获取我:01 0007 02 0043 03 0056此表达式不起作用:格式(“~@”,映射列表(fpair,[(1-246),(1-2),(3-2015)]。mardown下一步。你能举例说明你希望输出是什么样子吗?使用这3个定义,我可以生成一个格式化的长对列表:applist(124;,[])。applist(P,[X| L]):-Q=…[P,X],call Q),applist(P,L).dojustone(X):-format(“~@,[fpair(X)]).dolist(X):-applist(dolist,X)。最好编辑您的问题并将附加信息放在那里,格式正确。您可以回答您的问题。毕竟,值得一提的是:
Q=…[P,X],call(Q)
应替换为
call(P,X)
。为什么不使用惯用的
地图列表(P,L)
来达到同样的目的呢?