コンピュータサイエンス

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

6
自動定理証明の学習
私は自動定理証明 / SMTソルバー / 証明アシスタントを自分で学んでおり、ここからプロセスに関する一連の質問を投稿しています。 これらのトピックは、(数学的な)ロジックの背景なしでは簡単に要約できないことに注意してください。基本用語に問題がある場合は、M。HuthとM. Ryanによるコンピューターサイエンスのロジック(特に、第1章、第2章、第4章)またはPによる数学論理と型理論の紹介を読んでください。アンドリュース。 高次ロジック(HOL)の簡単な紹介については、こちらを参照してください。 私はCoqを見て、とりわけイザベルへの導入の最初の章を読みました。自動定理証明の種類 私は数十年にわたってPrologを知っていて、現在F#を学んでいるので、ML、O'Caml、およびLISPはボーナスです。Haskellは別の獣です。 私は次の本を持っています アラン・ロビンソンとアンドレイ・ボルンコフによる「自動推論のハンドブック」 ジョン・ハリソンによる「実践的論理と自動推論のハンドブック」 フランツ・バーダーとトビアス・ニプコウによる「用語の書き換えとすべて」 CoqとIsabelleの違いは何ですか? IsabelleまたはCoq、またはその両方を学習する必要がありますか? イザベルまたはCoqを最初に学習することには利点がありますか? ここでシリーズの次の質問を見つけます。

3
なぜ特定の「決定できない」問題を人間が解決できるのですか?
高次のパターンマッチングは、決定できない問題です。手段式所与、というアルゴリズムが存在しないことa => b、aおよびb単に型付きラムダ計算上のオープンな用語であるが、置換認めるSようにaS => bS、ここで=>「同じBnの正規形を有している」を意味します。しかし、人間はその問題を効率的に解決できます。たとえば、次の問題があるとします。 a = (λt . t (F (λ f x . (f (f (f x))))) (F (λ f x . (f (f x))))) b = (λ t . t (λ f x . (f (f (f (f (f (f x))))))) (λ f x . (f (f …

5
並列プログラミングと並行プログラミングの違いは?
並行プログラミングを見るとき、2つの用語、つまり並行と並列が一般的に使用されます。 また、一部のプログラミング言語は、Javaなどの並列プログラミングのサポートを明確に主張しています。 これは、並列プログラミングと並行プログラミングが実際に異なることを意味しますか?

1
{xy ∣ | x | = | y |、x≠y}はコンテキストフリーです
コンテキストフリーと思われる言語に関する次の質問に出くわしたことを覚えていますが、事実の証拠を見つけることができませんでした。おそらく質問を思い出したでしょうか? とにかく、ここに質問があります: 言語はコンテキストに依存しません。L = { x y∣ | x | = | y| 、x≠ y}L={バツy∣|バツ|=|y|、バツ≠y}L = \{xy \mid |x| = |y|, x\neq y\}



1
依存型の型推論を決定できないのはなぜですか?
依存型システムは推論可能ではないが、確認可能であることを述べました。なぜそうなのか、また、型が値によってインデックス付けできる「依存性」の限界があるかどうか、それより下では型推論が可能で、それより上ではできないという簡単な説明があるのだろうかと思いました。

9
一部のプログラミング言語は完全なチューリングですが、他の言語のいくつかの機能が欠けているのはなぜですか?
外部プログラム/関数にフックする(すべき)インタープリターを作成するときに奇妙な問題に遭遇しました: 'C'および 'C ++'の関数は可変引数関数をフックできません。たとえば、 'printf'を呼び出す関数を作成できません取得した引数とまったく同じ引数を使用し、代わりに可変個のオブジェクトを取る代替バージョンを呼び出す必要があります。匿名フックを保持するオブジェクトを作成できるようにしたいので、これは非常に問題です。 だから、Forth、JavaScript、そしておそらく他の多くの言語がアセンブリ言語/マシンコードに頼ることなくこれを非常に簡単に行うことができるので、これは奇妙だと思った。他の言語はこれを非常に簡単に行うことができるので、各プログラミング言語が解決できる問題のクラスは、これらの言語がすべてチューリング完全であっても、実際には言語によって異なりますか?

5
反復は再帰を置き換えることができますか?
私は、例えば、すべてのスタックオーバーフローの上で見てきたここでは、ここでは、ここでは、ここでは、ここで私は言及する気にしないいくつかの他、「用途再帰が唯一の反復を使用してプログラムに変換することができ、任意のプログラム」という。 はい、それは可能だと言った、非常に支持された答えを持つ、非常に支持されたスレッドさえありました。 今、私は彼らが間違っていると言っているのではありません。その答えは、コンピューティングについての私のわずかな知識と理解に反するだけです。 すべての反復関数は再帰として表現でき、ウィキペディアにはその旨の記述があると思います。しかし、その逆は真実ではないでしょう。1つには、非原始再帰関数を繰り返し表現できるかどうか疑問です。 また、ハイパーオペレーションを繰り返し表現できるかどうかも疑問です。 @YuvalFIlmusの質問に対する彼の答え(ちなみに私は理解できません)で、数学的操作のシーケンスを加算のシーケンスに変換することは不可能であると述べました。 YFの答えが確かに正しい場合(そうだと思いますが、彼の推論は私の頭の上にありました)、これはすべての再帰が反復に変換できるわけではないという意味ではありませんか?なぜなら、すべての再帰を反復に変換できれば、すべての操作を一連の加算として表現できるからです。 私の質問はこれです: すべての再帰を反復に変換できますか? 明るい高校生または最初の1年生が理解できる答えを与えてください。ありがとうございました。 PS原始再帰とは何かわかりません(アッカーマン関数については知っていますし、原始再帰ではありませんが、まだ計算可能です。それに関する私の知識は、アッカーマン関数のウィキペディアのページから得られます)。 PPS:答えが「はい」の場合、たとえば、非原始再帰関数の反復バージョンを記述できますか。たとえば、答えはアッカーマンです。理解するのに役立ちます。

11
なぜ誰もがCISCを望むのでしょうか?
コンピュータシステムの講義で、MIPSプロセッサについて紹介しました。これは、期間中に(再)開発されたものであり、実際には非常に理解しやすいものでした。RISC設計を使用します。つまり、基本コマンドは定期的にエンコードされ、配線をシンプルに保つためにそれらのコマンドはほとんどありません。 CISCは異なる哲学に従うと言われました。x86命令セットを簡単に見て、ショックを受けました。誰もが非常に複雑なコマンドセットを使用するプロセッサをどのように構築したいかを想像することはできません! そのため、プロセッサ市場の大部分がCISCアーキテクチャを使用する理由について、適切な議論が必要であると考えています。彼らは何ですか?

1
赤黒の木を想像してください。それを作成する挿入と削除のシーケンスは常にありますか?
次の赤黒ツリーの定義を想定してみましょう。 これは二分探索木です。 各ノードは赤または黒の色で表示されます。ルートは黒です。 エッジで接続された2つのノードを同時に赤にすることはできません。 wikiのように、NILリーフの適切な定義が必要です。NILの葉は黒く着色されています。 ルートから任意のNILリーフへのパスには、同じ数の黒いノードが含まれます。 質問 赤黒ツリーのinsertand delete操作を実装したとします。さて、あなたが有効な赤黒木を与えられたら、それを構築する一連の操作insertとdelete操作が常にありますか? 動機 この質問は、この質問とこの質問からの議論によって動機付けられています。ます。 個人的には、黒のノードだけで構成される有効な赤黒木を想像すると(完全にバランスの取れた木を想像していることを意味します)、それを構築するシーケンスinsertとdelete操作があると思います。しかしながら、 私はそれを正確に証明する方法がわかりません より一般的なケースにも興味があります

3
ピーターソンとデッカーのアルゴリズムの対比
ピーターソンとデッカーのアルゴリズムは非常によく似ており、多くの対称性を示しています。 私は次のような非公式言語でアルゴリズムを定式化しようとしました: Peterson's: "I want to enter." flag[0]=true; "You can enter next." turn=1; "If you want to enter and while(flag[1]==true&&turn==1){ it's your turn I'll wait." } Else: Enter CS! // CS "I don't want to enter any more." flag[0]=false; Dekker's: "I want to enter." flag[0]=true; "If you want to enter …

1
2つのスタックを持つプッシュダウンオートマトンは、チューリングマシンと同等ですか?
で、この答えは言及されています 通常の言語は、有限オートマトンによって認識できます。文脈自由言語にはスタックが必要であり、文脈依存言語には2つのスタックが必要です(これは、完全なチューリングマシンが必要であると言うことに相当します)。 上記の大胆な部分の真実に関して知りたいと思いました。実際、それは本当ですか?これに対する答えに到達する良い方法は何ですか?

2
高速スペルチェッカーを構築するための効率的なデータ構造
私はかなり大きな辞書で動作するはずのスペルチェッカーを書こうとしています。Damerau-Levenshtein距離を使用して、スペルミスの単語に最も近い単語を判断するために使用する辞書データを効率的にインデックス化する方法が本当に必要です。 私は、スペースの複雑さとランタイムの複雑さとの間の最適な妥協点を提供するデータ構造を探しています。 インターネットで見つけたものに基づいて、使用するデータ構造のタイプに関していくつかのリードがあります。 トライ これは私の最初の考えであり、実装が非常に簡単に見えるため、高速なルックアップ/挿入を提供するはずです。Damerau-Levenshteinを使用した近似検索は、ここでも簡単に実装できるはずです。しかし、ポインタストレージでは多くのオーバーヘッドが発生する可能性が高いため、スペースの複雑さに関してはあまり効率的ではありません。 パトリシア・トライ 基本的にポインターを保存するコストを回避しているため、これは通常のトライよりもスペースを消費しないようですが、私が持っているような非常に大きな辞書の場合、データの断片化が少し心配です。 サフィックスツリー これについては定かではありませんが、テキストマイニングで便利だと思う人もいるようですが、スペルチェッカーのパフォーマンスの面で何が得られるのかはよくわかりません。 三項検索ツリー これらはかなり見栄えがよく、複雑さの点ではパトリシアトライスに近い(より良い?)はずですが、パトリシアトライスよりも良いか悪いかは分からないでしょう。 バーストツリー これは一種のハイブリッドのようであり、トライスなどに比べてどのような利点があるかはわかりませんが、テキストマイニングには非常に効率的であると何度か読みました。 このコンテキストで使用するのに最適なデータ構造と、他のデータ構造よりも優れている点についてフィードバックを受け取りたいと思います。スペルチェッカーにさらに適切なデータ構造が不足している場合、私も非常に興味があります。

4
O(n log n)で記述される関数のクラスの名前は何ですか?
「ビッグO」では、一般的な表記法に共通の名前が付けられています(「ああ、一定の要素がある」と言う代わりに)。 O(1)は「定数」です O(log n)は「対数」です O(n)は「線形」です O(n ^ 2)は「二次」です O(n * log n)は??? それは単に「n log n」ですか、それとも上記のような特別な名前を持っていますか?

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