トップページ > プログラム > 2014年08月20日 > 32E1i6+B

書き込み順位&時間帯一覧

18 位/165 ID中時間01234567891011121314151617181920212223Total
書き込み数0000000000000000000000022



使用した名前一覧書き込んだスレッド一覧
デフォルトの名無しさん
【論理】Prolog【初心者】

書き込みレス一覧

【論理】Prolog【初心者】
747 :デフォルトの名無しさん[sage]:2014/08/20(水) 23:19:48.10 ID:32E1i6+B
>>746
>これはあくまでバックトラックを理解するための例として

初心者に対してバックトラックの理解を助ける最初の例として、
失敗駆動ループは不適切という話だ
もっと単純で分かりやすい例を持ち出すべきだった

>ただし、どうしても失敗駆動が必要になることもあるからね

そのとおりだね
どうしても使わなければ解決できない問題に対してだけ使うべき
たとえば>>744 のコードだと、全解探索結果リスト Xs が
メモリに乗り切れないほど巨大という極限のケースでは
失敗駆動ループ技法も(>>745と合わせて)検討候補になるだろう

逆に言えば、一般的な多くのケースで Prolog らしい
エレガントな解法があるのに、ただ書き慣れているからという理由で
安易に失敗駆動ループ技法を使うのは中級プログラマとして失格だと思う
だから >>744 ではバッド・ノウハウの類いと書いた
【論理】Prolog【初心者】
748 :デフォルトの名無しさん[sage]:2014/08/20(水) 23:58:46.17 ID:32E1i6+B
バックトラックの例について書く
たとえば(>>745 は気付いていると思うけど) >>744 はバックトラックの応用になる
  ?- multiply_of_product(X).
  X = 1 ; % 最初の解が表示され、";" をタイプするとバックトラックで次の解を求める
  X = 2 ;
  X = 3 ;
  X = 2. % 途中で止めたい時には [return] をタイプすると入力待ちに戻る

  ?-
この述語 multiply_of_product/1 に関して、組み込み述語 findall/3 を使って
すべての解のリストを求めたのが >>744 になる

またリストそのものもバックトラックの対象になる
  ?- append(Xs, Ys, [1,2,3]). % 述語 append/3 は2つのリストを結合したリストを求める
  Xs = [],
  Ys = [1, 2, 3] ;
  Xs = [1],
  Ys = [2, 3] ;
  Xs = [1, 2],
  Ys = [3] ;
  Xs = [1, 2, 3],
  Ys = [] ;
  false. % すべての解を探索し終えると false を表示して入力待ちに戻る

  ?-
同様に findall/3 を使ってすべての解のリストを求めてみる
  ?- findall((X,Y), append(X,Y,[1,2,3]), ListOfPair).
  ListOfPair = [ ([], [1, 2, 3]), ([1], [2, 3]), ([1, 2], [3]), ([1, 2, 3], [])].

  ?-


※このページは、『2ちゃんねる』の書き込みを基に自動生成したものです。オリジナルはリンク先の2ちゃんねるの書き込みです。
※このサイトでオリジナルの書き込みについては対応できません。
※何か問題のある場合はメールをしてください。対応します。