2

私はPrologの初心者であり、整数のセットmod K(L)がグループであるかどうかを確認するための簡単なテストを書いてみることができると思いました。私は、上記のセットが相加的であるかどうかを見つけることから始めました。Lの2つの要素ごとの合計がLの要素でもある場合。

私は次のように書いた:

group(A,K):-member(B,A),member(C,A),As is B+C, Bs is mod(As,K), member(Bs,A).

それから私はこれでそれを試しました:

trace. group([0,1,2],3).

これは、当然、すべての可能な合計を生成し、正しく、答えはそれらすべてに当てはまると答えます。

しかし、これらすべてのケースの後、最終的に次のように出力されます。

  1    1  Redo: group([0,1,2],3) ? 
  6    2  Redo: member(1,[0,1,2]) ? 
  6    2  Fail: member(1,[0,1,2]) ? 
  1    1  Fail: group([0,1,2],3) ?
  no

プログラムがこの最後のケースをチェックするのはなぜですか、それは私には無意味に思えますか?

この前の最後のケースは次のとおりです。

  1    1  Redo: group([0,1,2],3) ? 
  6    2  Redo: member(0,[0,1,2]) ? 
  6    2  Fail: member(0,[0,1,2]) ? 
  3    2  Redo: member(1,[0,1,2]) ? 
  3    2  Exit: member(2,[0,1,2]) ? 
  4    2  Call: _158 is 2+2 ? 
  4    2  Exit: 4 is 2+2 ? 
  5    2  Call: _186 is 4 mod 3 ? 
  5    2  Exit: 1 is 4 mod 3 ? 
  6    2  Call: member(1,[0,1,2]) ? 
  6    2  Exit: member(1,[0,1,2]) ? 
  1    1  Exit: group([0,1,2],3) ? 

  true

それがすべきことをします。

4

2 に答える 2

1

このような目的でトレーサーを使用することはあまり役に立ちません。それはあなたに無関係である多くの詳細を示します。代わりに、問題の適切な定式化に集中してください。意味のある名前に集中してください。Aセット、およびB要素Cに使用します。それは改善することができます!

現在テストしているのはこれです:

Kを法とする和が同じ集合にある集合の2つの要素が存在します。

あなたがテストしたいのはそれです:

SのすべてのX、Yの場合:((X + Y)mod K)inS。

操作自体は次のように記述できます。Z is (X+Y) mod K

トレーサーはそれをどのように説明できますか?

group(S、K):-
   \ +(
         member(X、S)、member(Y、S)、Zは(X + Y)mod K、
         \ +メンバー(Z、S)
   )。

?-グループ([0,1,2]、3)。
本当。

?-group([0,2]、3)。
false。
于 2012-11-16T00:26:52.737 に答える
0

トレーサーは、バックトレーサーがたどったすべての異なるブランチを示していると思います。そのため、最後に試したブランチからの成功したステートメントの1つを否定しているように見えるので、今回は別の解決策を使用します。

実行全体を見るとFail: (7) lists:member(0, [0, 1, 2])、2番目の評価のように、実際に真である失敗した述語が確かにわかります。

[trace]  ?- group([0, 1, 2], 3).
   Call: (6) group([0, 1, 2], 3) ? creep
   Call: (7) lists:member(_G718, [0, 1, 2]) ? creep
   Exit: (7) lists:member(0, [0, 1, 2]) ? creep
   Call: (7) lists:member(_G718, [0, 1, 2]) ? creep
   Exit: (7) lists:member(0, [0, 1, 2]) ? creep
^  Call: (7) _G721 is 0+0 ? creep
^  Exit: (7) 0 is 0+0 ? creep
^  Call: (7) _G724 is 0 mod 3 ? creep
^  Exit: (7) 0 is 0 mod 3 ? creep
   Call: (7) lists:member(0, [0, 1, 2]) ? creep
   Exit: (7) lists:member(0, [0, 1, 2]) ? creep
   Exit: (6) group([0, 1, 2], 3) ? creep
true ;
   Redo: (7) lists:member(0, [0, 1, 2]) ? creep
   Fail: (7) lists:member(0, [0, 1, 2]) ? creep
   Redo: (7) lists:member(_G718, [0, 1, 2]) ? creep
   Exit: (7) lists:member(1, [0, 1, 2]) ? creep
^  Call: (7) _G721 is 0+1 ? creep
^  Exit: (7) 1 is 0+1 ? creep
^  Call: (7) _G724 is 1 mod 3 ? creep
^  Exit: (7) 1 is 1 mod 3 ? creep
   Call: (7) lists:member(1, [0, 1, 2]) ? creep
   Exit: (7) lists:member(1, [0, 1, 2]) ? creep
   Exit: (6) group([0, 1, 2], 3) ? creep
true ;
   Redo: (7) lists:member(1, [0, 1, 2]) ? creep
   Fail: (7) lists:member(1, [0, 1, 2]) ? creep
   Redo: (7) lists:member(_G718, [0, 1, 2]) ? creep
   Exit: (7) lists:member(2, [0, 1, 2]) ? creep
^  Call: (7) _G721 is 0+2 ? creep
^  Exit: (7) 2 is 0+2 ? creep
^  Call: (7) _G724 is 2 mod 3 ? creep
^  Exit: (7) 2 is 2 mod 3 ? creep
   Call: (7) lists:member(2, [0, 1, 2]) ? creep
   Exit: (7) lists:member(2, [0, 1, 2]) ? creep
   Exit: (6) group([0, 1, 2], 3) ? creep
true ;
   Redo: (7) lists:member(_G718, [0, 1, 2]) ? creep
   Exit: (7) lists:member(1, [0, 1, 2]) ? creep
   Call: (7) lists:member(_G718, [0, 1, 2]) ? creep
   Exit: (7) lists:member(0, [0, 1, 2]) ? creep
^  Call: (7) _G721 is 1+0 ? creep
^  Exit: (7) 1 is 1+0 ? creep
^  Call: (7) _G724 is 1 mod 3 ? creep
^  Exit: (7) 1 is 1 mod 3 ? creep
   Call: (7) lists:member(1, [0, 1, 2]) ? creep
   Exit: (7) lists:member(1, [0, 1, 2]) ? creep
   Exit: (6) group([0, 1, 2], 3) ? creep
true ;
   Redo: (7) lists:member(1, [0, 1, 2]) ? creep
   Fail: (7) lists:member(1, [0, 1, 2]) ? creep
   Redo: (7) lists:member(_G718, [0, 1, 2]) ? creep
   Exit: (7) lists:member(1, [0, 1, 2]) ? creep
^  Call: (7) _G721 is 1+1 ? creep
^  Exit: (7) 2 is 1+1 ? creep
^  Call: (7) _G724 is 2 mod 3 ? creep
^  Exit: (7) 2 is 2 mod 3 ? creep
   Call: (7) lists:member(2, [0, 1, 2]) ? creep
   Exit: (7) lists:member(2, [0, 1, 2]) ? creep
   Exit: (6) group([0, 1, 2], 3) ? creep
true ;
   Redo: (7) lists:member(_G718, [0, 1, 2]) ? creep
   Exit: (7) lists:member(2, [0, 1, 2]) ? creep
^  Call: (7) _G721 is 1+2 ? creep
^  Exit: (7) 3 is 1+2 ? creep
^  Call: (7) _G724 is 3 mod 3 ? creep
^  Exit: (7) 0 is 3 mod 3 ? creep
   Call: (7) lists:member(0, [0, 1, 2]) ? creep
   Exit: (7) lists:member(0, [0, 1, 2]) ? creep
   Exit: (6) group([0, 1, 2], 3) ? creep
true ;
   Redo: (7) lists:member(0, [0, 1, 2]) ? creep
   Fail: (7) lists:member(0, [0, 1, 2]) ? creep
   Redo: (7) lists:member(_G718, [0, 1, 2]) ? creep
   Exit: (7) lists:member(2, [0, 1, 2]) ? creep
   Call: (7) lists:member(_G718, [0, 1, 2]) ? creep
   Exit: (7) lists:member(0, [0, 1, 2]) ? creep
^  Call: (7) _G721 is 2+0 ? creep
^  Exit: (7) 2 is 2+0 ? creep
^  Call: (7) _G724 is 2 mod 3 ? creep
^  Exit: (7) 2 is 2 mod 3 ? creep
   Call: (7) lists:member(2, [0, 1, 2]) ? creep
   Exit: (7) lists:member(2, [0, 1, 2]) ? creep
   Exit: (6) group([0, 1, 2], 3) ? creep
true ;
   Redo: (7) lists:member(_G718, [0, 1, 2]) ? creep
   Exit: (7) lists:member(1, [0, 1, 2]) ? creep
^  Call: (7) _G721 is 2+1 ? creep
^  Exit: (7) 3 is 2+1 ? creep
^  Call: (7) _G724 is 3 mod 3 ? creep
^  Exit: (7) 0 is 3 mod 3 ? creep
   Call: (7) lists:member(0, [0, 1, 2]) ? creep
   Exit: (7) lists:member(0, [0, 1, 2]) ? creep
   Exit: (6) group([0, 1, 2], 3) ? creep
true ;
   Redo: (7) lists:member(0, [0, 1, 2]) ? creep
   Fail: (7) lists:member(0, [0, 1, 2]) ? creep
   Redo: (7) lists:member(_G718, [0, 1, 2]) ? creep
   Exit: (7) lists:member(2, [0, 1, 2]) ? creep
^  Call: (7) _G721 is 2+2 ? creep
^  Exit: (7) 4 is 2+2 ? creep
^  Call: (7) _G724 is 4 mod 3 ? creep
^  Exit: (7) 1 is 4 mod 3 ? creep
   Call: (7) lists:member(1, [0, 1, 2]) ? creep
   Exit: (7) lists:member(1, [0, 1, 2]) ? creep
   Exit: (6) group([0, 1, 2], 3) ? creep
true ;
   Redo: (7) lists:member(1, [0, 1, 2]) ? creep
   Fail: (7) lists:member(1, [0, 1, 2]) ? creep
   Fail: (6) group([0, 1, 2], 3) ? creep
false.
于 2012-11-16T00:36:43.510 に答える