/ / Rozumowanie w kwestii prologu - prolog, programowanie deklaratywne

Uzasadnienie w kwestii prologu - prolog, programowanie deklaratywne

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

Spodziewany wynik:

X to lista wartości, Res to miejsce, w którym wynik powinien być zapisany.

Wyobraź sobie, że dzwonię:

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

Rezultatem powinien być:

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

Ale wynik jest następujący:

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

i tak dalej...

Co jest złego w moim kodzie i rozumowaniu, aby zrozumieć, co poszło nie tak?

Odpowiedzi:

3 dla odpowiedzi № 1

W przypadku pierwszej klauzuli wynikiem pustej listy harmonogramów powinna być pusta lista wartości:

foo([], []).

Przedstawiasz argumenty za append/3 w złej kolejności (Res powinno być konkatenacją X i Res2):

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

Teraz, aby uniknąć nieskończonego poszukiwania przez Prologa dalszych rozwiązań, zmień kolejność podzbiorów w drugiej klauzuli:

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