将列表枚举转换为格式化的字符串

时间:2019-09-15 20:35:48

标签: prolog swi-prolog

对于Prolog,我是一个全新的人,正在尝试枚举N个节点的所有可能的二叉树。我希望以以下格式输出(此示例将用于2个节点):

    (.(.))
    ((.).)

现在我获得了正确的输出,但是它采用了序言列表的形式,如下所示:

    [[], [[], []]]
    [[[], []], []]

这是我的代码:

    :- use_module(library(clpfd)).

    tree(0,[]).
    tree(N, [Lt, Rt]) :-
    N #> 0,
    N #= N1 + N2 + 1,
    N1 #>= 0, N2 #>= 0,
    tree(N1, Lt), tree(N2, Rt).

如何将其转换为字符串并重新格式化?

1 个答案:

答案 0 :(得分:2)

仅使用声明性IO,即以DCG(定句语法)表示代码:

:- use_module(library(clpfd)).

tree(0,[]) --> "".
tree(N, [Lt, Rt]) -->
    {N #> 0,
     N #= N1 + N2 + 1,
     N1 #>= 0, N2 #>= 0
    },
    "(", tree(N1, Lt), ".", tree(N2, Rt), ")".

试运行:

?- phrase(tree(2,T),S),format('~s~n',[S]).
(.(.))
T = [[], [[], []]],
S = [40, 46, 40, 46, 41, 41] ;
((.).)
T = [[[], []], []],
S = [40, 40, 46, 41, 46, 41] ;
false.

edit :遵循@PauloMoura建议:添加指令

:- set_prolog_flag(double_quotes, chars).

并享受简化的界面:

?- phrase(tree(2,T),S).
T = [[], [[], []]],
S = ['(', '.', '(', '.', ')', ')'] ;
T = [[[], []], []],
S = ['(', '(', '.', ')', '.', ')'] ;
false.