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



我是prolog的新手,正在尝试枚举所有可能的具有N个节点的二叉树。我希望以以下格式输出(此示例适用于 2 个节点(:

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

现在我得到了正确的输出,但它是以 prolog 列表的形式出现的,如下所示:

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

这是我的代码:

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

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

只需使用声明式 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.

编辑:遵循@PauloMoura建议:添加指令

:- set_prolog_flag(double_quotes, chars).

并享受简化的界面:

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

最新更新