对于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).
如何将其转换为字符串并重新格式化?
答案 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.