2014-12-10 2 views
-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] ; 

и так далее ...

Что не так в моем коде и рассуждениях, так что я понимаю, что пошло не так?

ответ

3

Для первого пункта, то результат для пустого списка расписаний должна быть пустой список значений:

foo([], []). 

Вы положили аргументы для append/3 в неправильном порядке (Res должен быть конкатенация X и Res2):

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

Теперь для того, чтобы избежать Пролог сделать бесконечный поиск дальнейших решений, изменить порядок подцелей во втором пункте:

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

Привет, человек, спасибо, что ответ! Почему неправильный порядок подцелей? –

Смежные вопросы