2016-09-14 9 views
2

このコードを理解する上で問題があります。追加構文の理解

powerset(L, [H|T]):- 
    append([H|T], _, L). 

これは、threadに由来し、正確に私が望むものです。しかし、私も使用しているコードを理解したいと思います。

答えて

3

私たちが最初に孤立して句の単一の目標を考えてみましょう:

?- append([H|T], _, L). 

これは何を意味するのでしょうか?純粋なPrologコードでは、関係についてもっと学ぶのに便利で便利な方法があります。をトップレベルに照会して、どのような解があるかを見てください。

試してみてください!

Lは常にから構成されています:

  • Hとして例えば:私たちはappend/3のこの呼び出しはその引数の間の関係を定義し、我々は以下のパターンを見ることがわかり、このから

     
    ?- append([H|T], _, L). 
    L = [H|_1282], 
    T = [] ; 
    L = [H, _1078|_1096], 
    T = [_1078] ; 
    L = [H, _1078, _1084|_1108], 
    T = [_1078, _1084] ; 
    L = [H, _1078, _1084, _1090|_1120], 
    T = [_1078, _1084, _1090] ; 
    etc. 
    

    第1の要素

  • とそれに続くすべての要素がT
  • f接尾辞のついた

ことがappend([H|Ts], _, Ls)の意味を正確に何ので、これは、思わぬされていません。すべてのでによって任意のリストを追っ[H|Ts]リスト  Lsを構成しています。あなたの具体的な使用例で

は、Lをインスタンス化し、そのサフィックスは任意の長さにすることはできませんことを意味していることは明らかです。

例えば

 
?- append([H|T], _, [a,b,c]). 
H = a, 
T = [] ; 
H = a, 
T = [b] ; 
H = a, 
T = [b, c] ; 
false. 

だから、我々は全体の句の意味を参照してくださいには、(リストは接尾辞  変数名中で示されているように、私は、変数の名前を変更しました)

 
powerset(Ls, [H|Ts]):- 
    append([H|Ts], _, Ls). 

Ls場合は、要素Ts続いて、その最初の要素Hとして含むリストであり、その後にはがあります。、リスト[H|Ts]は、Lのpowersetのメンバーです。非公式

リストのすべての空でない接頭辞が冪のメンバーです。

そして、それはこのスレッドに表示されるこのことから我々はまた、powerset/2の明白な省略を参照してください条項のいずれも空 は冪のメンバーとしてを設定していない、さらに不穏、それらのどれも得ませんは有効なセットとして空のセットを受け入れ、そう間違って次を失敗:

 
?- powerset([], _). 
false. % empty set is not a set? 

は練習:正しいpowerset/2となり、powersetのすべての要素に対して実際に成功するようになります。