prolog问题的推理

时间:2014-12-10 16:17:36

标签: prolog declarative-programming

foo([], Res).
foo([schedule(_, X)|Tail], Res) :- append(Res, X, Res2), 
                                   foo(Tail, Res2).  

预期结果:

X是值列表,Res是存储结果的位置。

想象一下,我打电话给:

foo([schedule(c1,[t1,t2]),schedule(c2,[t3,t4])], X).

结果应该是:

X = [t1,t2,t3,t4].

但结果是:

X = [] ;
X = [_G6951] ;
X = [_G6951,_G6957] ;
X = [_G6951,_G6957,_G6963] ;
X = [_G6951,_G6957,_G6963,_G6969] ;
X = [_G6951,_G6957,_G6963,_G6969,_G6975] ;
X = [_G6951,_G6957,_G6963,_G6969,_G6975,_G6981] ;
X = [_G6951,_G6957,_G6963,_G6969,_G6975,_G6981,_G6987] ;

依旧......

我的代码和推理有什么问题,以便我明白出了什么问题?

1 个答案:

答案 0 :(得分:3)

对于第一个子句,空的日程表列表的结果应该是一个空的值列表:

foo([], []).

您将append/3的参数置于错误的顺序(Res应该是XRes2的串联):

foo([schedule(_, X)|Tail], Res) :-
    append(Res2, X, Res), 
    foo(Tail, Res2).

现在,为了避免Prolog无限寻找进一步的解决方案,请在第二个子句中更改子目标的顺序:

foo([schedule(_, X)|Tail], Res) :-
    foo(Tail, Res2),
    append(Res2, X, Res).