1

Oz で次の 2 つの非常によく似た演習を行う必要があります。

*。リスト L とブール関数 P を取る関数 {Some LP} を書きます。これは、P が L の少なくとも 1 つの要素に対して true を返す場合に true を返し、それ以外の場合は false を返します。

*。L のすべての要素に対して P が true である場合にのみ true を返す関数 {All LP} を記述します。

私が確信していないのは、私がこのような関数を持っているかどうかです.どうすればtrueまたはfalseを返すことができますか:

    declare
fun{P X} //bolean function
   if X==2 then true
   else false
   end
end

fun{Some L P} //Some function
   case L
   of nil then nil
   [] X|Xr then
      if {P X} == true then X|{Some Xr P}
      else {Some Xr P}
      end
   end
end

{Browse {Some [1 2 3] P}} 

2 は真なので、真を返す必要があります

4

2 に答える 2

1

いくつかのヒント:

まず、空のリストの場合の望ましい結果について考えます。現在、あなたは戻ってきていnilます。おそらく戻ってくるはずfalseです。空のリストでは、述語を満たす要素が存在できないためです。

次に、P が真である要素を 1 つ見つけた場合について考えてみましょう。リストの残りの部分を繰り返す必要はないと思います...

于 2015-02-25T16:48:17.767 に答える
0

関数Someでは、空のリストの場合に nil 値を返しますが、関数によって返されるブール値が必要なため、空のリストがP何であれ、関数を確実に満たすことができないため、false にする必要があります。次に、 を満たす要素を見つけたらP、残りのリストをチェックする必要はありません。ロジックまたは演算子として機能する Oz operator を使用できますがorelse、最初の引数が false の場合にのみ 2 番目の引数を評価します。

この関数{All L P}は同様の方法で動作します。これで、 を満たさない要素が見つかったときにリストのチェックを停止Pできるため、Oz 演算子を使用できますandthen。唯一の違いは、次のステップで関数が false を返す nil 要素を評価し、関数内のすべての関数値を false にするため、リストが 1 つの要素で構成されている場合 (最後の要素を評価する場合と同じ問題) を確認する必要があることです。andthen声明。

最後に: Oz の行コメントはこの形式% My commentsであり、スラッシュの場合とは異なります。

私の長い答えと私の英語で申し訳ありませんが、コードは次のようになります。

declare
fun{P X}
   if X==2 then true
   else false
   end
end

fun{Some L P}
   case L
   of nil then false
   [] X|Xr then {P X} orelse {Some Xr P}
   end
end

fun{All L P}
   case L
   of nil then false
   [] [X] then {P X}
   [] X|Xr then {P X} andthen {All Xr P}
   end
end  

{Browse {Some [1 2 5] P}} 
{Browse {All [2 2 2 2] P}}
于 2015-02-26T17:50:47.477 に答える