コンピュータサイエンス

コンピュータサイエンスの学生、研究者、実務家のためのQ&A

1
IOモナドは技術的に間違っていますか?
haskell wikiには、IOモナドの条件付き使用の次の例があります(こちらを参照)。 when :: Bool -> IO () -> IO () when condition action world = if condition then action world else ((), world) この例では、の定義はすべてをより理解しやすくするためのものであるIO aことRealWorld -> (a, RealWorld)に注意してください。 このスニペットは、IOモナドで条件付きでアクションを実行します。さて、それconditionがFalseであると仮定すると、アクションactionは決して実行されるべきではありません。遅延セマンティクスを使用すると、これが実際に当てはまります。ただし、ここではHaskellが技術的に厳密ではないことに注意してください。これは、たとえば、コンパイラーがaction world別のスレッドでプリエンプティブに実行することを許可され、後で必要でないことが判明したときにその計算を破棄することを意味します。ただし、その時点までに副作用はすでに発生しています。 さて、プログラム全体が終了したときにのみ副作用が伝播されるようにIOモナドを実装し、どの副作用を実行すべきかを正確に知ることができます。ただし、これはそうではありません。Haskellで無限のプログラムを作成することが可能であるため、明らかに中間の副作用があります。 これは、IOモナドが技術的に間違っていることを意味しますか、またはこれを防ぐ他の何かがありますか?

5
関数パラメーター型としてボトム型の使用例はありますか?
関数の戻り値の型が⊥(bottom type)の場合、戻り値がないことを意味します。たとえば、どちらもかなり普通の状況で終了またはスローできます。 おそらく、関数にtype型のパラメーターがある場合、(安全に)呼び出すことはできません。そのような関数を定義する理由はありますか?

3
空白記号がチューリングマシンの入力アルファベットの一部と見なされないのはなぜですか?
チューリングマシンの定義は、入力シンボルの一部ではない空白記号について常に明示的です。 事実上、空白記号は既に入力の一部になっているように見えるので、入力アルファベットの一部にするとどうなるのでしょうか。 最後の文の「ように見える」ことを説明するには、次のことを考慮してください。 デフォルト設定では、入力の右側に無数の空白記号が表示されます。テープヘッドが最初の空白記号の上を移動しても、受け入れ状態または拒否状態である必要がないため、計算を続行できます。 ここで、計算が続いてその最初の空白記号の右側に入力アルファベットから記号を書き込み、次に左端の位置に戻り、同時に開始状態に戻ると仮定します。その後、別のテープで「やり直し」ます。事実上、これは別の入力から始まり、以前は存在しなかったブランクの右側に入力シンボルがあります。入力には、空白記号が効果的に含まれているようです。マシンのさらなる動作も異なる可能性があります。ブランクに再び遭遇すると、右側に異なるシンボルが出現します。 このシナリオが実際に可能であると仮定して、入力アルファベットの空白記号部分を考慮しないのはなぜですか?また、「初期」入力の一部としてそれを含めることを許可しないのはなぜですか? おそらく、それは入力が常に無限であるとは限らないように入力を定義するための単なる方法でしょうか?


2
時間での単語分解
2つの文字列与えられた場合、それらの連結のためにを記述します。文字列を考えるとと整数、我々は書くの連結のためののコピー。文字列が与えられると、この表記を使用して「圧縮」できます。つまり、はとして記述できます。レッツ・コールの体重圧縮そこに登場するキャラクタの数、重量のように、 2である、との重量(圧縮の)3であります(分けるS1,S2S1,S2S_1, S_2S1S2S1S2S_1S_2SSSk≥1k≥1k\geq 1(S)k=SS⋯S(S)k=SS⋯S(S)^k = SS\cdots SkkkSSSAABAABAABAABAABAAB((A)2B)2((A)2B)2((A)^2 B)^2((A)2B2)((A)2B2)((A)^2 B^2)(AB)2A(AB)2A(AB)^2 AABABAABABAABABAAAA単数または複数)は別々にカウントされます。 今、与えられた文字列の「最軽量」圧縮計算する問題を検討と。少し考えた後、正確なアプローチに応じてまたはで実行される明らかな動的プログラミングアプローチがあり。SSS|S|=n|S|=n|S|=nO(n3logn)O(n3log⁡n)O(n^3 \log n)O(n3)O(n3)O(n^3) ただし、この問題は時間で解決できると言われていますが、これを行う方法に関する情報源は見つかりません。具体的には、この問題は最近のプログラミングコンテスト(問題K ここ、最後の2ページ)で与えられました。分析中にアルゴリズムが提示され、最後に疑似2次境界が示されました(ここでは4分マーク)。悲しいことに、プレゼンターは「複雑な単語の組み合わせ補題」に言及しただけだったので、解決策を求めるためにここに来ました:-)O(n2logn)O(n2log⁡n)O(n^2 \log n)O(n3logn)O(n3log⁡n)O(n^3 \log n)

2
指数関数的ではあるがPである問題
私は、「例外的に有用」なアルゴリズム/問題のリストを作成しようとしています。たとえば、本質的に非常に指数関数的であるように見えますが、最終的にそれらを解決するいくつかの特に賢いアルゴリズムを持っています。意味の例: 線形計画法(シンプレックスアルゴリズムは指数時間です。多項式時間解を見つけるのに長い時間がかかりました!) より一般的には、半正定値プログラミング 素数テスト 2-SATおよびHORNSAT 行列式の計算(これが難しいと思われない場合は、恒久的と考えてください) 完全に一致するものを見つける 有限単純群の分類を使用して達成できるさまざまなハードグループ理論の問題 複雑なForbidden Minorキャラクタリゼーション(任意の表面への埋め込み可能性、ツリー幅とブランチ幅の境界、デルタワイ還元可能グラフ)を使用して達成できるさまざまなハードグラフの問題 有界グループでの指数の計算(つまり、繰り返しの2乗によって達成されるように、\ log bステップでaを計算)abモッドkabモッドka^b \mod kログbログ⁡b\log b LLLアルゴリズムに依存する計算。(特別な場合:ユークリッドアルゴリズム。より一般的な場合:PSLQまたはHJLSアルゴリズム。) テイラー項のない制約問題(?)。私はこれを完全には理解していませんが、おそらく上記の2-SAT / HORNSATのケースと有限体上の線形代数を包含しているように聞こえます。長い投稿についてはこちらをご覧ください ホログラフィック縮小を介して計算可能な問題。 尊敬すべき言及として、私はグラフ同型も言及します。それはまだ非常に簡単()であり、他の多くの同型問題と同等だからです:nログ2nnログ2⁡nn^{\log^2 n} Digraphs / multigraphs / hypergraphs(一種の「より難しい」問題) 有限オートマトン/ CFG 明らかに、これらにはさまざまな困難がありますが、少なくとも一部の人々は、問題は難しいように聞こえるが扱いやすいという意味で「驚き」の感覚を持ちます。LPは比較的簡単に聞こえるかもしれませんが、実際のソリューションを構築するにはかなりの時間がかかりました。繰り返し二乗または2-SATを解くことは、学部生が独力で思いつく可能性がありますが、HORNSATを見ずにNP-Completeの問題のみを学んだ場合、NP-Completenessの自然な候補のように聞こえるかもしれません。CFSGを解くか、デルタワイ還元可能性をチェックする多項式の方法を持つことは、平均的な偉業ではありません。 これが理にかなっていることを願っています。ここには明らかに多くの主観的な属性がありますが、他の人が「明らかに難しい」問題に対する効率的な解決策であると思うものを聞いてみたいです。

2
Brainfuck Turingを完全にするのに十分なブラケットのペアは何個ですか?
Brainfuckは、8つのシンボル(I / Oを無視する場合は6つ)のみを使用するチューリング完全プログラミング言語です。 それをチューリングの完全性に押し上げる最も注目すべきものは[、と]、本質的にBrainfuckのレーベルとgotoです。 通常、Brainfuckのプログラムはの複数のセットを使用しますが[]、Brainfuck Turingを完成させるためにこれらのブラケットのペアを正確にいくつ使用する必要があるのでしょうか? もっと簡単に言うと、n状態のチューリングマシンをシミュレートするために必要なブラケットの最小量はどれくらいですか(1、2、および3状態のチューリングマシンのブラケットの数を与えます)。 ノート: 無限のテープを想定しており、計算上の制限はありません。 2シンボルチューリングマシンです。

4
主要な改札口オペレーターとはどういう意味ですか?
著者はプログラミング言語のセマンティクスを表すために異なる表記法を使用することを知っています。実際のところ、ガイ・スティールは興味深いビデオでこの問題に取り組んでいます。 主要な回転式改札口のオペレーターが十分に認識されている意味を持っているかどうかを誰かが知っているかどうかを知りたい。たとえば、次の分母の先頭にある先頭の演算子がわかりません。⊢⊢\vdash x:T1⊢t2:T2⊢λx:T1.t2 : T1→T2x:T1⊢t2:T2⊢λx:T1.t2 : T1→T2\frac{x:T_1 \vdash t_2:T_2}{\vdash \lambda x:T_1 . t_2 ~:~ T_1 \to T_2} 誰かが私を理解するのを助けることができますか?ありがとう。

1
カテゴリー理論(のサブセット)と関係代数の間に同型はありますか?
ビッグデータの観点から来ています。基本的に、多くのフレームワーク(Apache Sparkなど)は、Functor / Monadのようなインターフェイスを提供することにより、リレーショナル操作の欠如を「補償」し、cats-to-SQL変換(ScalaのSlick)への同様の動きがあります。たとえば、SQLパースペクティブからの要素ごとのベクトルの乗算には、自然な結合(インデックスの繰り返しがないと仮定)が必要です。これは、カテゴリ理論のアプリケーションでzip + map(multiply) (SparkのMLibが既に持っているElementwiseProduct)と見なすことができます。 簡単に言うと(以下の例はScalaにあります): 参加の参照サブケースは、その順番で私たちを与えるのApplicativeファンクタ(オーバー分別収集)、と考えることができますzip:List(1,2,3).ap(List(2,4,8).map(a => (b: Int) => a * b))- > (List(1,2,3) zip List(2,4,8)).map(x => x._1 * x._2)。さらに、いくつかの前処理(groupBy演算子または単なる射影、または一般に-エピモーフィズム)を想定して、他の結合に誘導することができます。 他の結合と選択はモナドと考えることができます。たとえば、WHERE次のとおりです。- List(1,2,2,4).flatMap(x => if (x < 3) List(x) else List.empty)>List(1,2,2,4).filter(_ < 3) データ自体は単なるADT(GADTでもあります)であり、単純なSet-category(またはより一般的に言えば-デカルト閉)のように見えるため、Setベースの操作(カリーによるHoward-Lambek自体)およびRENAME(少なくとも実際には)同様の操作。 集約はfold/reduce(カタモフィズム)に対応 だから、私が求めているのは、カテゴリ理論(のおそらくサブセット)と(全体の)関係代数の間の同型を構築できるか、または何かが明らかにされているということですか?それが機能する場合、カテゴリの正確な「サブセット」は正代数と同型ですか? logic-cats-lambdaのCurry-Howard-Lambek対応のような正式なソリューションはより正確ですが、実際には、完成した研究への参照を求めています(直接的な関係を示しています) )Scala / Haskellでさらに例を示します。 編集:受け入れられた答えは、私がモナドとして結合と条件を表現しすぎていると考えさせました(特に事実上FALSEをインスタンス化する空の値を使用して)、少なくともSQLのrelalgebraサブセットについてはプルバックで十分だと思います。モナドは、GROUP BYのような高次(ネスト)のものに適しています。これは、代数の一部ではありません。

3
抽象ゲームの最適戦略
私はインタビューで次の問題を与えられました(過去に自分のやり方をだまそうとするのではなく、すでに解決できていません):ゲームは正の整数始まります。(たとえば、A 0 = 1234。)この数値はバイナリ表現に変換され、Nは1に設定されたビット数です。(たとえば、A 0 = b 100 1101 0010、N = 5。)A0A0A_0A0=1234A0=1234A_0 = 1234NNN111A0=b100 1101 0010A0=b100 1101 0010A_0 = b100\ 1101\ 0010N=5.N=5.N = 5. プレイヤー1は、A 0よりも小さい数字選択します。B 0は 1に1ビットのみが設定されていなければならない(例:B 0 = B 10 0000 0000 = 512ましょう。)A 1 = A 0 - B 0。(例A 1 = 1234 - 512 = 722 …

5
健全性が一貫性を意味するのはなぜですか?
一貫性と完全性は健全性を意味するという質問を読んでいましたか?そして、その中の最初の文は言う: 健全性は一貫性を意味することを理解しています。 健全性は一貫性よりも弱い表現だと思っていたので、私は非常に困惑していました(つまり、一貫性のあるシステムは健全でなければならないと思っていましたが、それは真実ではないと思います)。一貫性と健全性のために、MITの6.045 / 18.400コースで Scott Aaronsonが使用していた非公式の定義を使用していました。 健全性=証明システムは、証明するすべてのステートメントが実際に真実である場合に証明されます(証明可能なものはすべて真実です)。すなわち、IF(は証明可能)(はTrue)。したがって、IF(式へのパスがあります)THEN(その式はTrueです)ϕϕ\phi⟹⟹\impliesϕϕ\phi 一貫性=一貫性のあるシステムは、決してAとNOT(A)を証明しません。したがって、1つのAまたはその否定のみがTrueになります。 これらの(おそらく非公式の)定義を念頭に置いて、健全ではあるが一貫性のないシステムがあることを示すために、次の例を作成しました。 CharlieSystem≜{Axioms={A,¬A},InferenceRules={NOT(⋅)}}CharlieSystem≜{Axioms={A,¬A},InferenceRules={NOT(⋅)}} CharlieSystem \triangleq \{ Axioms=\{A, \neg A \}, InferenceRules=\{NOT(\cdot) \} \} サウンドシステムだと思った理由は、公理が正しいと仮定するからです。したがって、AではなくAが両方とも当てはまります(はい、除外された中間の法則は含まれていません)。唯一の推論規則は否定であるため、公理からAではなくAの両方に到達し、互いに到達できることがわかります。したがって、このシステムに関してはTrueステートメントのみに到達します。ただし、システム内の唯一のステートメントの否定を証明できるため、もちろんシステムは一貫していません。したがって、サウンドシステムには一貫性がない可能性があることを示しました。この例が間違っているのはなぜですか?私は何を間違えましたか? 私の頭の中でこれは直感的に理にかなっています。健全性とは、推論ルールから始めて公理とクランクを設定すると、真の目的地(ステートメント)にのみ到達するということです。ただし、実際にどの目的地に到着したかはわかりません。ただし、一貫性は、または(両方ではない)に到達する宛先にのみ到達できることを示しています。したがって、すべての一貫したシステムには、公理として除外された中間の法則を含める必要があります。もちろん、私はそうではなく、唯一の公理の否定を他の公理として含めました。だから、私があまりにも賢いことをしたとは思わないが、どういうわけか何かが間違っていますか?¬ AAAA¬A¬A\neg A 私はスコットの非公式の定義を使用しているため、それが問題になる可能性があることに気づきました。質問を書く前でもウィキペディアをチェックしましたが、その定義は私には意味がありませんでした。特に彼らが言う部分: システムのセマンティクスに関して 完全な引用は次のとおりです。 システムで証明できるすべての式は、システムのセマンティクスに関して論理的に有効です。

1
サンタよりもルパートにとってプレゼントの袋を詰めるのは簡単ですか?
または:プレゼントを受け取るためにルパートが必要ですか? ルーティングの問題は別として、サンタは次の問題に直面しています(何度も何度も): capacity¹とバッグを考えるとCCCやプレゼントの集合{ p1、… 、pn}{p1、…、pn}\{p_1, \dots, p_n\}サイズでそれぞれ、s私s私s_iは、彼は子供たちが作りたい{ c1、… 、ck}{c1、…、ck}\{c_1, \dots, c_k\}幸せ。彼は子供のことを、すべての希望リストから知っているcjcjc_j値存在p私p私p_i正確にvi 、j∈ Q≥ 0v私、j∈Q≥0v_{i,j} \in \mathbb{Q}_{\geq 0}多くを。 これはプレゼントの(対で互いに素)セットそのすべてフィットして、それぞれの子のために選択すること、すなわち私j⊆ [ 1 .. n ]私j⊆[1 ..n]I_j \subseteq [1..n] 、∑J ∈ [ 1 .. K ]∑I ∈ Ijs私≤ C∑j∈[1 ..k]∑私∈私js私≤C\qquad\displaystyle \sum_{j \in [1..k]} \sum_{i \in I_j} s_i \leq C そして、可能な限り多くの幸福が続きます²、すなわち ?マックス!∑J ∈ [ …

2
建設的な論理における「矛盾」とは何ですか?
でプログラミング言語のための実用的な基礎、ロバート・ハーパー氏は述べています 命題が真であるということは、それを証明することを意味する場合、命題が偽であるとはどういう意味ですか?それは我々が持っていることを意味反論それは証明できないことを示して、それのを。つまり、命題は、それが真実である(証拠がある)という仮定が既知の事実と矛盾することを示すことができれば偽です。 しかし、その後、これは疑問を招きます-建設的/直観的論理の矛盾は何ですか? これは何らかの形でを派生させるという意味ですか?これは賢明な方法でどのように起こりますか?フォームの判断を導入する必要がありますか?(⊥ true)(⊥ true)(\bot\text{ true})(A⊃⊥ true)(A⊃⊥ true)(A \supset \bot \text{ true}) あるいは、読者の裁量で、何かを矛盾していると非公式にラベル付けするという意味では、おそらく意味がありますか?たとえば、とを対立する命題として解釈ます。a=ba=ba = ba≠ba≠ba \neq b
12 logic 

2
coqによるトートロジーの証明
現在、私はCoqを学ぶ必要があり、どのように対処するのかわかりませんor: 例として、それは簡単ですが、証明する方法がわかりません: Theorem T0: x \/ ~x. 誰かが私を助けることができれば、私は本当に感謝しています。 参考のために、このチートシートを使用します。 また、私が念頭に置いている証拠の例:二重否定の場合: Require Import Classical_Prop. Parameters x: Prop. Theorem T7: (~~x) -> x. intro H. apply NNPP. exact H. Qed.
12 logic  coq 

4
n個の設定ビットを持つ数値を正確に生成するためのPRNG
現在、バイナリデータを生成するコードを書いています。具体的には、指定されたビット数で64ビットの数値を生成する必要があります。より正確には、プロシージャはを取り、正確にビットがに設定され、残りが0に設定された擬似ランダム64ビット数を返す必要があります。0&lt;n&lt;640&lt;n&lt;640 < n < 64nnn111 私の現在のアプローチには、次のようなものが含まれます。 擬似乱数64ビット数を生成します。kkk のビットをカウントし、結果を保存します。kkkbbb 場合、出力します。それ以外の場合は1に進みます。b=nb=nb = nkkk これは機能しますが、洗練されていないようです。これよりもエレガントにセットビットの数を生成できるPRNGアルゴリズムの種類はありますか?nnn

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.