2013-03-08 4 views
0

У меня есть следующие функции:Выберите «Повторить до отказа», почему?

fillNonDrivers(Car, Pmd, Plo, ListOfPassengers) :- 
    select(Passenger, Pmd, Plo1), 
    Passenger = [_,n,_], 
    /* etc */ 

я вызываю его след на следующим образом:

fillNonDrivers([hello, 2], [[david, n, punk]], PLO, LOP). 
1 1 Call: fillNonDrivers([hello,2],[[david,n,punk]],_29,_30) ? c 
2 2 Call: select(_111,[[david,n,punk]],_112) ? c 
2 2 Exit: select([david,n,punk],[[david,n,punk]],[]) ? c 
2 2 Redo: select([david,n,punk],[[david,n,punk]],[]) ? c 
2 2 Fail: select(_99,[[david,n,punk]],_100) ? c 
1 1 Fail: fillNonDrivers([hello,2],[[david,n,punk]],_29,_30) ? c 
no 

Я не понимаю, почему Redo называется в вышеприведенном следа. Не должны иметь выбор «работал», и, таким образом, следующая строка вызывается быть

Passenger = [_,n,_], 

Может кто-нибудь помочь объяснить появление повторить здесь? Заранее спасибо.

+0

Это действительно странно. Какую реализацию Prolog вы используете? Каково определение предиката? – 2013-03-08 08:03:50

ответ

1

GNU Prolog, кажется, не отображает цели объединения (=) в трассировке. Смотрите также этот упрощенный пример:

GNU Prolog 1.4.2 
By Daniel Diaz 
Copyright (C) 1999-2012 Daniel Diaz 
| ?- [user]. 
compiling user for byte code... 
f(X) :- X=3. 

user compiled, 2 lines read - 182 bytes written, 12539 ms 

(266 ms) yes 
| ?- trace. 
The debugger will first creep -- showing everything (trace) 

yes 
{trace} 
| ?- f(N). 
     1 1 Call: f(_17) ? 
     1 1 Exit: f(3) ? 

N = 3 

yes 
{trace} 
| ?- 

Обратите внимание, что не существует ни одного шага, как X=3, в отличие от трассировки шага SWI 7, который дал CappeliC.

Это значит, что следующий гол после Passenger = ... не смог пройти.

0

это означает, что ваше правило не срабатывает непосредственно перед привязкой к пассажиру, и этого никогда не должно произойти, учитывая тестовый пример. След должен сообщить, что не удается, на самом деле в SWI-Пролог:

fillNonDrivers(Car, Pmd, Plo, ListOfPassengers) :- 
    select(Passenger, Pmd, Plo1), 
    Passenger = [_,n,_], 
    /* etc */ 
    length(Plo1, 1). % expect a failure 

4 ?- fillNonDrivers([hello, 2], [[david, n, punk]], PLO, LOP). 
Call: (6) fillNonDrivers([hello, 2], [[david, n, punk]], _G995, _G996) 
Call: (7) lists:select(_G1100, [[david, n, punk]], _G1102) 
Exit: (7) lists:select([david, n, punk], [[david, n, punk]], []) 
Call: (7) [david, n, punk]=[_G1093, n, _G1099] 
Exit: (7) [david, n, punk]=[david, n, punk] 
Call: (7) length([], 1) 
Fail: (7) length([], 1) 
Redo: (7) lists:select(_G1100, [[david, n, punk]], _G1102) 
Fail: (7) lists:select(_G1100, [[david, n, punk]], _G1102) 
Fail: (6) fillNonDrivers([hello, 2], [[david, n, punk]], _G995, _G996) 
false. 

Может быть ошибка вашего Пролог отладчик?