У меня есть следующие функции:Выберите «Повторить до отказа», почему?
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,_],
Может кто-нибудь помочь объяснить появление повторить здесь? Заранее спасибо.
Это действительно странно. Какую реализацию Prolog вы используете? Каково определение предиката? – 2013-03-08 08:03:50