-1
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] ;

等々...

何が問題なのかを理解できるように、コードと推論の何が問題なのですか?

4

1 に答える 1

3

最初の句では、スケジュールの空のリストの結果は値の空のリストになります。

foo([], []).

の引数をappend/3間違った順序で配置します (はとResの連結でなければなりません):XRes2

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

ここで、Prolog がさらなる解決策を無限に検索するのを避けるために、2 番目の節のサブゴールの順序を変更します。

foo([schedule(_, X)|Tail], Res) :-
    foo(Tail, Res2),
    append(Res2, X, Res).
于 2014-12-10T16:23:14.760 に答える