我编写的程序枚举了所有可能由n个节点组成的树,输出是一个字符串列表。每个字符串都是一组括号,表示树中的节点。到目前为止,这是我的代码:
gZero(X) :- X > 0.
isZero(X) :- X =:= 0.
minusOne(X,Y) :- Y is X-1.
addOne(X,Y) :- Y is X+1.
find_trees(0,0,X,[Y|X]).
find_trees(N,D,Str,[Trees]) :-
(isZero(D),string_concat(Str,'(',X),minusOne(N,I),addOne(D,K) ->
find_trees(I,K,X,[Tree]));
(gZero(N),gZero(D),string_concat(Str,'(',X),minusOne(N,I),addOne(D,K) ->
find_trees(I,K,X,[Tree]));
(gZero(D),string_concat(Str,')',X),minusOne(D,K) ->
find_trees(N,K,X,[Tree])).
该程序是递归的,并且跟踪已放置的节点数量和树中当前的深度,当所有节点都已放置并且您处于深度0时,应该有一个括号您添加到列表的字符串。计划是有线
find_trees(0,0,X,[Y|X]).
是我的基础案例,但是当我发现Prolog刚刚开始构建下一个字符串并继续这样做时。
我的下一个想法是在主find_trees体中引入一个新的条件,有点像这样:
find_trees(N,D,Str,[Trees]):-
(isZero(N), isZero(D)->
????)
我只是介绍另一个条件来检查我们是否处于基本情况,但是我不确定要放入体内的内容,以便Prolog能够确定[Trees]的值是一个括号字符串列表。有没有想过如何为此做一个基础案例?
编辑:我已经修复了无限递归,但程序仍然没有"看到"我的基本情况而不是失败。有什么想法吗?
修复是添加另一个条件,以便当N和D都为零时唯一真正的find_trees子句是基本情况。