Prolog以递归方式构建字符串列表

时间:2015-09-17 06:05:43

标签: recursion prolog

我编写的程序枚举了所有可能由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子句是基本情况。

0 个答案:

没有答案