「論理型プログラミング言語」という言葉に聞き馴染みはあるでしょうか?
プログラマの中でも、論理型プログラミング言語を用いた実装経験のある方は少ないのではないでしょうか。
AI・人工知能というテーマを避けては通れない今の時代、ほぼすべての人が知らないうちに「論理型プログラミング言語」の恩恵を受けているものなのです。
この記事を読むことで、日頃触れない言語についても理解が深まり、人工知能研究の背景を覗くことができるかも知れません。
教養を深めたい方にも活躍の幅を広げたい方にも、これから論理型プログラミングを学びたい方にも、ぜひ目を通して頂けたらと思います。
社会人からシステムエンジニアを6年間経験し、現在はフリーランスとなり日々勉強中。 エンジニア時代から海外の開発者との交流も多く、海外での仕事も夢見て場所を問わずノマド生活を送っている。
論理型プログラミングとは何か?

まずは論理型プログラミングの概念をおさえておきましょう。
論理型プログラミングの基本概念
プログラミング言語には、その目的や成り立ちから多くの言語が存在します。その中でも、論理型プログラミングは、数理論理学の考え方に基づいた言語です。一般的なプログラミング言語の分類の中では、宣言型プログラミングに分類されます。
オブジェクト指向プログラミングに代表される世の中の多くの言語は、手続き型言語だと言われていますが、手続き型言語と比較すると、処理の方法が大きく異なります。
例えば、どのように処理を行うか(how)を記述するものが手続き型プログラミングであるのに対して、論理型プログラミングでは、何であるか(what)を記述します。
つまり、処理を記述するのではなく、知識を記述するとも言い換えられます。論理型プログラミングでは、プログラム内に具体的な処理を記載するのではなく、事実とルールを定義し、それに対して問いを投げかける導出という推論によって処理を行います。
論理型プログラミングの特徴と利点
論理型プログラミングは、その特徴から人工知能の分野で活用されることも多いです。
大きく二つの理由があると言われています。
① 上記のような推論による処理を行うことができるため
② 人間の情報処理に近い考え方を持っているため
特に②の補足として、対照的な手続き型プログラミングの特徴について考えてみるとわかりやすいでしょう。
例えば、手続き型プログラミングでは、具体的な処理を記載し、実行をすることが基本となります。
そのため、プログラムのどこか一行が抜けてしまうと、正しく動作できない場合や、全体の動作が止まってしまう恐れがあります。
一方、論理型プログラミングでは、一行抜けてしまっても全体が止まってしまうことはほぼありません。
人間の脳にある情報も、その一つ一つに意味があり、どれか一つを抜いてもすべてが動作しなくなるわけではありません。
そういった観点からも、人工知能の研究開発と親和性があるといえるでしょう。
近年では、クイズアプリや論理証明を用いて回答を導き出すような身近なアプリにも活用されています。
論理型プログラミング言語一覧

論理型プログラミング言語の特徴は大まかに理解して頂けたでしょうか。
次に、論理型プログラミング言語を代表する言語をいくつかピックアップして見ていきましょう。
それぞれ、性質と用途が異なりますが、詳細なポイントの比較は以下の表を参考にして頂けたらと思います。
論理型プログラミング言語と言えば、「Prolog」を思い浮かべる方が多いかも知れません。
しかしながらその歴史を振り返ると、研究対象の多様化、扱うデータ量の増加、より精度の高い推論が求められるなど、
多くの課題が出てくるようになりました。その背景を頭の片隅に置きつつ、言語一覧に目を通して見てください。
| 言語名 | 開発時期と背景 | 特徴 | 主な活用事例 |
| Prolog | 1972年、論理をベースにした言語Plannerと独立して、 より論理を重視したものとして開発された |
定理証明に似た導出 一つの命題からのみなるホーン節に限定 |
多くのエキスパートシステムにて利用 |
| Datalog | 1977 年、Prologの類似言語として登場 | facts から facts へ変換するルールをrules として記述する | データのマッピングに強みを持ち、データベーススキーマの変換等に利用される |
| Mercury | 1995年 、Prologに関数型言語の機能を追加して 拡張したものとして開発された |
コンパイル時のエラー検出に強みがあり、 実行において世界最速の論理型言語と言われている |
コンパイラやフォーマッターに活用される |
| Answer Set Programming (ASP) | 1997年、推論機能を強化する取り組みの中で開発された | 論理型プログラミングと 制約型プログラムの概念を融合したもの |
近年における人工知能分野にて利用 |
| Gödel | 1992年、不完全性定理を提唱した論理学者ゲーテルの名にちなむ | メタプログラムに重要なサポートを 提供するゲーデルのメタ論理機能 |
コンパイル、検出、デバッグ機能 |
Prolog
Prolog は 1972 年に 開発された論理型言語で、主に数学や自然言語処理の分野で利用されています。
Prolog では、手続き型言語とは異なり、具体的に処理を命令するようなプログラムは記載しません。
ある命題に対して、「AはBである」という形で定義を行い、実行時には「○○の条件を満たす△△は何か?」と質問をすることで答えを導きます。
論理型言語が宣言型言語に分類されているのも、定義が並べられていることからも感じられます。
1960年代より研究が進んでいましたが、先の研究により開発されていたPlannerという言語のサブセットとしてではなく、
独立した言語として、より論理を強化した形で開発されました。それ以降、人工知能の開発を支える言語となりました。
Datalog
Datalog は、1977年に Prolog のサブセットとして開発されました。主に演繹データベースのクエリ言語として用いられます。
論理的な制約を満たすデータをデータベースから抽出します。データのマッピングに強みを持ち、データベース間のバージョンの検知といったデータベースのスキーマの変換に強みを持っています。一般的にDatalog の利用は Prolog より制限されたものとなっています。
制限があることで、クエリの効率的な実行を実現していると言えます。Datalog もPrologと同じく、宣言的な言語であり、実行される命令の順序に依存しません。
特に多くのバージョンやスキーマを持つデータベースを管理する場合に活用されます。
Mercury
Mercuryは、1995年にPrologに関数型言語の機能を追加して開発されたものです。当時も人工知能の研究が盛んに行われていましたが、大規模なデータ処理や効率の良い実行システムに課題が生じていました。
MercuryもPrologをベースにしていますが、関数型言語の機能を追加して開発されたことにより、プログラムのコンパイル時にエラーの検出を行うことや、実行速度の効率化ができるようになりました。
特に関数型の表現ができることにより、論理証明における表現の簡略化が可能になったことが大きな功績とされています。
この改善により、その後の人工知能の研究には大きく寄与することとなりました。
Answer Set Programming (ASP)
Answer Set Programming (以下、ASP)は1997年に開発されたものです。こちらもPrologを元にした論理型プログラミング言語です。その中でも、論理型と制約型の性質を融合した言語で、解集合意味論の下で解決する方法を解集合プログラミングと呼んでいます。
1980年以降、当時の論理型プログラミング言語の課題であった推論機能を強化するために研究開発が行われました。
より最適化された結果を返すための検索エンジンとして利用されています。
Gödel
Gödelは、1992年に開発された言語で、不完全性定理の提唱者として知られている論理学者ゲーデルが残したプログラミング言語です。算術的命題の中には、証明も反証もできないものが存在することをゲーデルは示しました。
メタプログラムにおいて重要な考え方を提供している言語であり、コンパイラ等の検出機能において利用されています。
論理型プログラミングの事例
論理型プログラミングにも様々な言語が存在することを見て頂きました。時代の変遷に合わせて、必要な進化を遂げてきた片鱗を感じて頂けたでしょうか。
ここからは、具体的なイメージが湧いてくるように、実際にどのような場面で活用されているのかについて見てみましょう。
人工知能の開発にも必要不可欠な「エキスパートシステム」、「ナレッジベースシステム」、「自然言語処理」の3つの観点から事例をご紹介したいと思います。
エキスパートシステム
エキスパートシステムとは、一般のユーザーが専門家と同じレベルの問題解決ができるようにサポートしてくれるシステムのことです。
身近で利用されている例としては、AI医師による診断等が挙げられます。自動応答システムが問診をするものです。その他にも弁護士の代わりに交通違反異議申し立てのアドバイスができるようなものも出てきています。
エキスパートシステムは、その構造も一般的なプログラムとは異なる独特の構造をしています。専門家が答えを導く思考回路を模した開発がされており、知識と問題解決をする処理を切り離して独立させています。その構造を「推論エンジン」と「知識ベース」と呼んでいます。
推論エンジンは、専門家の知識を集めてその知識を知識ベースに蓄積していきます。言わば人間の脳のような働きをする部分です。そして、知識ベースに蓄積されている知識をもとに推論を行い、結論を導く役割を担っています。
以前、第2次人工知能ブームと言われた1980年代当時は、「もしAならばB」というレベルの処理をすることが限界でした。
そこには、膨大な専門知識間の定式化・人間の手作業によるルール化の難しさ等、多くの課題がありました。
そのような背景の中で開発されたのが、上記で紹介してきた論理型プログラミング言語です。
処理速度の向上や、扱うことのできるデータ量の向上により、人工知能研究が進み、エキスパートシステムの課題も解決されていきました。
ナレッジベースシステム
続いて、ナレッジベースシステムについてです。ナレッジベースシステムは大きく分けると次の2種類に大別されます。
①コンピュータが読み取ることを想定したもの
コンピュータが読み取り可能な形式で知識を格納します。一般的には、これらの知識に対して自動的に推論を行うことが目的とされます知識は論理的に一貫した方法でルール・規則という形式で記述されます。
②人間が読み取ることを想定したもの
人間が扱える形式で知識を蓄積したものです。Q&Aや、マニュアルをイメージして頂くとわかりやすいかも知れません。
既に先人が解決できた問題の解決法を集積し、その分野に不慣れな人の支援をすることができます。
現代ではナレッジベースマネジメントという言葉も多く使われるようになりました。これは知識を集約し、その知識を参照・編集していくものです。ここでも、効率の良いロジックによる検索速度の向上や、データベースのスキーマ変換において論理型プログラミング言語が活用されています。
自然言語処理
自然言語処理はAI・人工知能をテーマによく聞かれる言葉になっているのではないでしょうか。
人間が日常的に使っている言葉を自然言語と言います。自然言語処理は、自然言語をコンピュータに処理させる技術で、コンピュータに人間の言葉を教えることだとも言われています。
今の時代、ChatGPTの登場やGoogle検索エンジンにより、コンピュータが長い文章を高い精度で処理できるようになりました。人工知能への関心の高まりと、言語自体の発展の影響もあり、自然言語処理を取り巻く研究や事例も大幅に増えてきています。
自然言語処理は、人間が日常のコミュニケーションに用いている言葉を対象として、それらの意味を解析し処理します。自然言語処理の研究では、言葉を学習させる、または食べさせるという表現を使うことも多いです。
具体的な活用事例では、チャットボット、文字変換予測、メールフィルター、テキストマイニング、機械翻訳等、様々な領域で活用されています。
論理型プログラミング言語の比較
いくつかの事例で見てきたように、論理型プログラミングは現代の人工知能開発を支えていることがわかると思います。
知識(事実とルール)を集積し、そこに推論を投げかけるというものが論理型プログラミング言語の基本となります。
最後に、論理型プログラミング言語の棲み分けについて今一度見ていきましょう。
言語ごとの特徴と適用範囲の比較
Prologでは、一階述語論理のモデル理論および証明理論が主でしたが、その後の研究により、いくつもの種類の論理型プログラミングが生まれました。
例えばデータ構造としてストリーム機能を備えた並行論理プログラミング言語は、より大規模なデータを扱う際に利用されています。
知識(事実とルール)の集積にはデータベースが欠かせませんが、データベース管理には、スキーマ管理も必要になってきますので、その際にはDatalogのような言語があると容易にマッピングが可能となります。
関数型の表現も可能にしたMercuryもそうですが、実行速度の向上にも寄与したことで、かつての課題が解決し、より人工知能研究が発展することになりました。
ASPに代表される述語記号の項に制約も加えるようになった制約論理プログラミング言語によって、さらに複雑な推論を行うことも可能となりました。
その結果、例えば検索エンジンにおいて、より最適化された検索結果を返すことができるようになりました。
使用される業界や分野の違い
Prologは数学・論理証明において多く活用されてきました。シンプルな検索エンジンを開発するだけであれば、論理型プログラミング言語を用いる必要もないと思います。
しかしながら、AI・人工知能の分野で複雑かつ、大規模なデータを扱う場合に論理型プログラミング言語を用いる必要が出てきます。
大容量のデータを扱い、多くのバージョンやスキーマを管理するような場合は、そのスキーマ変換には、データマッピングに強みを持つDatalogが利用されることが多いです。
また、検索結果の最適化や、最近のターゲティング広告を高精度に実現する際には、ASPのような解集合プログラムを利用されています。
複雑な数学の証明に用いる場合は、関数型の表現を使えたほうが、論理式が簡易的に表現できることもあるため、Mercury等の関数論理プログラミング言語が利用されることもあります。このようにそれぞれに得意分野があります。
論理型プログラミングのまとめ

昨今話題のchatGPTをはじめ、AI・人工知能という言葉は毎日のように聞かれる時代になっていると思います。
正直今の時代はオープンソースのプログラムも多く、一般プログラマが人工知能開発でこれらの言語を利用する機会は少なくなっているかも知れません。
しかし、高速な検索エンジンや、AI・人工知能発展に寄与しているのは、大規模なデータを高速で、かつ高度な推論を扱うことのできる「論理型プログラミング言語」が存在するからだということを頭の片隅に置いておいて頂けたらと思います。



