repeat/0は、常に成功する組み込み述語です。"fail"の後、IF/Prologは最後に成功した節までバックトラックをして戻り、別の解を満たそうと試みます。repeatが手続き中で最後に成功した節であった場合には、その結果として"無限個の解"を持つことになり、バックトラックが無限に繰り返されることになります。repeatは、次の様な節で定義されたように動きます。
repeat. repeat :- repeat.
repeat/0によって起こったル−プから脱け出るには、それに続く節が成功するか(1番目の例)、あるいはカット'!'が実行されなければなりません(2番目の例)。そうすれば、repeatでのバックトラック点が削除されます。もちろんル−プは、例外処理が起きた場合にも止まります(3番目の例)。
?- write('>'), repeat, get(C), ( [C] == "q" ; write('>'), fail). >w >y >q yes ?- [user]. | go :- repeat, | write('>'), read(W), | ( atomic_length(W,4),!, fail ; fail ). | end_of_file. yes ?- go. >red. >qwertyuiop. >stop. no ?- go. >a(b). E X C E P T I O N:atom_expected:atomic_length(a(b),4) ?- _
| scroll to top |
|