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が呼び出された理由がわかりません。select "worked"を使用するべきではないため、次に呼び出される行は

 Passenger = [_,n,_],

誰かがここでやり直しの外観を説明するのを手伝ってもらえますか?前もって感謝します。

4

2 に答える 2

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=3CappeliCが提供したSWIトレースステップ7とは対照的に、のようなステップはないことに注意してください。

つまり、次の目標Passenger = ...が失敗したということです。

于 2013-03-08T12:32:41.990 に答える
0

これは、Passengerにバインドする直前にルールが失敗していることを意味し、テストケースを考えると、これは決して発生しないはずです。トレースは、実際にSWI-Prologで何が失敗しているかを報告する必要があります。

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.

Prologデバッガーのバグである可能性がありますか?

于 2013-03-08T08:09:13.363 に答える