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] ;
等等...
我的代码和推理中出了什么问题,以便我了解出了什么问题?
对于第一个子句,空计划列表的结果应该是空的值列表:
foo([], []).
你把append/3
的参数放在错误的顺序上(Res
应该是X
和Res2
的串联):
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).