Prologが命令型プログラミングでSQLよりも人気がない理由の歴史的な先例は?[閉まっている]


12

宣言 的プログラミングSQLは、命令型プログラミングで非常に人気があるようです。ただし、Declarative を記述するPrologことで複雑さを大幅に節約できるようにも見えますが、これはあまり一般的ではありません。

PrologよりもSQLがこのように優先されるという歴史的な先例はありますか?

理由が命令型言語によるネイティブサポートの欠如である場合、言語の作成者がそもそもネイティブサポートPrologが有用であるとは思わなかった理由に答えることは可能ですか?


特定の例を提供するには:

例1
ローンアプリケーションの評価は、ほんの数行のコードでPrologあるSELECT/JOINクエリのように、ほんの数行のコードであるかもしれませんがSQL、利点はそれほど明白ではないようですSQL

例2
別の問題例とPrologの解決策を次に示します。次の制約論理プログラムは、教師としてのジョンの歴史の簡略化されたデータセットを表しています。

teaches(john, hardware, T) :- 1990  T, T < 1999.
teaches(john, software, T) :- 1999  T, T < 2005.
teaches(john, logic, T) :- 2005  T, T  2012.
rank(john, instructor, T) :- 1990  T, T < 2010.
rank(john, professor, T) :- 2010  T, T < 2014.

次の目標節は、データセットを照会して、john が論理を教えて教授だった時期を見つけます。

:- teaches(john, logic, T), rank(john, professor, T).

結果:

2010  T, T  2012.

上記の例ではSQL、同じ結果を簡単に取得できます。ただし、このデータがにあるとしますArray。その場合、を使用して同じ結果を得るのは簡単ではありませんSQL。そして、配列に保存されたデータの場合、Prologコードの方が簡単に記述して保守できると信じています。


8
あなたは暴言の側​​面をダイヤルダウンすることができます。

4
テキストのほとんどは、Prologを使用しない人々に対する暴言のように聞こえます。質問する価値のある質問が含まれていますが、他のもの(暴言)は、投票数を引き付け、回答を提供できる人をオフにします。つまり、質問をより慈善的な方法で表現することをお勧めします。

6
「たとえば、ローン申請の評価は、Prologのほんの数行のコードかもしれません」私はこれを購入しません。それは、その価値のあるアプリケーションが大量のカスタムメイドまたは生成されたSQLクエリを使用するのと同じ理由です。
陶酔14

7
たぶん何かが足りないかもしれませんが、ここで答えは「人々がSQLを使用するのはデータベースがサポートしているからだ」と思う。
GrandmasterB

3
彼ら Prologを使用します…実際……彼らは「Prologの半分のアドホックで、非公式に指定された、バグに乗った、遅い実装」であるRules Enginesを使用ます。
ヨルグWミットタグ14

回答:


19

これは主に歴史的なものだと思います。

SQLは、主にビジネスアプリケーションを作成するためにビジネスで使用されました。一部の企業は、SQLソリューションの販売で活気を取り戻し、そのお金を使ってSQLを宣伝し、多くの人々の心に押し込んでいます。これは特に、ビジネスマンにとってデータがどれほど重要であるかによって強化されました。これが、SQLが多くの競合他社に勝ち、今日でも非常に広く知られ、使用されている理由です。

他の方法でのプロローグは、学術分野、通常は人工知能の分野でほとんど知られていました。アカデミックな人々は、ビジネスのやり方でツールやアイデアを他人にプッシュすることはめったにありません。通常、一般的な開発者に広まるためには、学界で生まれた技術を宣伝する企業が必要です。また、データは非常に重要ですが、「ビジネスルール」はそうではありません。それらは重要に思えるかもしれませんが、データほど重要ではありません。通常、ビジネスルールは簡単に修正できます。「壊れた」データを修正しようとすることは、通常、はるかに難しい問題です。したがって、企業はビジネスルールソリューションよりもデータソリューションの取得に重点を置いています。


2
「通常、ある企業が学界で生まれた技術を宣伝して、一般的な開発者に広めることが必要です。」:本当。アカデミアでは多くの優れたアイデアが開発され、後にマーケティングの力を持っている企業から人気を得ています。+1
ジョルジオ14

6

理由は実際には非常に簡単です。特定のタスクに対して言語がどれほど役立つか、コードがどれだけ保守可能かということとは関係ありません。

多くの開発者は、SQLステートメントを読んで、言語を知らなくても最も基本的なクエリが何をするかを判断できます。複雑な例の場合は苦労しますが、既存のコードの適合やサンプルからの作業は比較的簡単です。大部分のクエリでは、理解の障壁が非常に低くなっています。

プロローグの数行を読むと、多くの開発者が少し目をそらし、タスクを他の誰かに任せ、おそらく横になります。prologの述語構文は、簡単に読めるようにはなりません。

更新:

コードサンプルに基づいて、コレクションを実装する言語はうまくいくはずです。私はC#/ Linqでソリューションを実装しましたが、プロローグサンプルよりも大きくはありませんでした(静的型付けと定義が必要だったため)。リストをマージして検索する単一のタイムラインを作成するための暫定的な作業に含まれる追加のステップがありましたが、それは大きな作業ではありませんでした。


14
SQLがCOBOLグレードの非常に冗長で「読みやすい」構文を採用していることは事実です。しかし、SQLを知らない人が、中程度の複雑なステートメントを数join秒またはcount(*)そのようなもので適切に理解できるかどうかは非常に疑わしいです。SQLの基本を理解しているのは、その言語をときどき使用しなければならないため、これらの基本を学ぶ必要があるためです。リレーショナルデータストレージは、ロジックシステムを解決するよりもはるかに一般的なニーズであるため、Prologを学習するための比較的強い必要性はありません。
アモン14

3
@amonそれは良い答えの始まりのように聞こえます:-)
svick 14

1
SQLを学習するための障壁は、読みやすさのために低下するかもしれません。しかし、確かに、SQLがサブクエリといくつかの結合を理解していなくても、ささいなことではありません。しかし、単純なクエリで開始するときの低い障壁は、確かに人々が開始するためにPrologの代わりにSQLを使用する理由です。:)
ディランミース14

4
@JamesSnell申し訳ありませんが-1。あなたが主張していることは、どの正規表現とも一致しません。^(?:(?:(?:0?[13578]|1[02])(\/|-|\.)31)\1|(?:(?:0?[13-9]|1[0-2])(\/|-|\.)(?:29|30)\2))(?:(?:1[6-9]|[2-9]\d)?\d{2})$|^(?:0?2(\/|-|\.)29\3(?:(?:(?:1[6-9]|[2-9]\d)?(?:0[48]|[2468][048]|[13579][26])|(?:(?:16|[2468][048]|[3579][26])00))))$|^(?:(?:0?[1-9])|(?:1[0-2]))(\/|-|\.)(?:0?[1-9]|1\d|2[0-8])\4(?:(?:1[6-9]|[2-9]\d)?\d{2})$
53777A 14

1
@JamesSnell RegExは不可解で、作成、デバッグ、保守、変更、拡張が困難ですが、非常に人気があります。もしあなたが正しかったなら、RegExは開発者と言語作成者の間で現在の人気を得ることはなかったはずです。
53777A 14

4

別の理由があります。実用的には、SQLはディスクに保存されたデータに役立ちます。そのため、データベースは「長期間」(数か月間)データを保存するために使用されます。すべてのSQLデータベース(PostgreSQL、MySQL、Oracleなど)は、ディスク(またはSSD、つまり、適切に電源を切ってもデータを保持できるハードウェア)上のデータを管理しています。ただし、私が知っているほとんどのProlog実装はメモリ内で動作し、データを確実に保持するために使用することはできません(少なくともプログラムされた停電後もデータが持続します)。また、SQL実装はテラバイトのデータを処理できます。

もちろん、DBMSはディスクにすぐには書き込みません(ただし、後で)。しかし、私が聞いたPrologインタープリターは、それらをディスクに永続化するために、事実とルールのベースを(暗黙的に)決して書きません。

(一部の言語実装には永続性機能があります。たとえば、SBCL with save-lisp-and-die...ですが、Prologがそれを行っていることは知りません)。

実用的には、SQLはデータベース(ディスク上の)用ですが、Prologはプログラミング言語(テキストファイルのソースコード用)です。


1
ディスクI / Oと厳密に連携するSQLデータベースは非常に非効率的であるため(常にメモリ内にデータが存在するため)、データベースへのプロローグ制約をシリアル化するための技術的な障害はないため、そうは思いません。現時点で考えることができます。
idoby 14

3
理論的には、SQLはクエリ言語であり、データがリレーショナルモデルで記述されている限り、データの格納方法は気にしません。SQLは単なるインターフェイスであり、パラダイムではありません。非永続メモリで純粋にまたは部分的に動作するSQLを使用するデータベースがあります。SQLを使用するデータベースで、データをPrologファクトの形式で保存することも可能です。[要出典]結局のところ、事実は単に関係を説明しているだけです。逆に、Prologエンジンがすべてをメモリにロードするのではなく、事実をデータベースのような方法でディスクに保存することはおそらく可能でしょう。
アモン14

1
理論的にははい、しかし実質的にSQLがディスク上に保存され、そしてそれはしばしば不可欠である
バジーレStarynkevitch

1
@BasileStarynkevitchのルールと事実は、ディスク上に保持されるソースコードに記述されています。代わりにデータベースに保存するのはなぜですか?Prologがデータを保持できないとはどういう意味ですか?それを行うことは想定されていません。それがデータベースが存在する理由です。もっと詳しく教えてください。
53777A 14

1
まさに、SQLはデータベース用であり、Prologはプログラミング言語です。それが私のポイントです。
バジルスタリンケビッチ14

1

これまで言及されていない側面の1つは、1980年代および1990年代の「オープン」システムの推進です。多くの場合、ソフトウェアベンダーは、データベース内のデータへの業界標準のアクセスを提供する必要があります。当時、SQLはよく知られ、理解されていた確立された標準でした。プロローグはかなり難解でアカデミックでした。システムを簡単に接続するためにODBCのようなインターフェイスを取得し始めたら、他のテクノロジーに関心を持つ人はいません。

私は80年代後半に、市場の圧力/調達規制によりSQLインターフェイスを追加することを余儀なくされた非常に成功したISAMデータベースを持っていた場所で働いていました。

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