ユニフィケーション()は数理論理学や計算機科学の用語であり、問題を解く際のアルゴリズム的プロセスである。ユニフィケーションは、見た目の異なる2つのが同一または同等であることを示すを求めるのが目的である。ユニフィケーションは自動推論、論理プログラミング、プログラミング言語の型システムの実装などに幅広く用いられている。なお、ユニフィケーションを単一化あるいは統一化とも呼ぶ。主なユニフィケーションは数種類ある。等号を持たない論理(理論)において、2つの項が同一であることを示すためのユニフィケーションは統語論的ユニフィケーションと呼ばれる。空でない等号を持つ論理(理論)で2つの項の同等性を示す場合、それを意味論的ユニフィケーションと呼ぶ。置換は順序集合として順序付けられるので、ユニフィケーションは束におけるを求める手続きとして解釈できる。ユニフィケーションを初めて形式的に研究したのはで、一階述語論理の導出手続きを構築する際に一階のユニフィケーションを基盤として使い、組合せ爆発の原因の1つ(項を例化したものの探索)を排除することで自動推論技術への大きな一歩とした。変数記号の集合 X = {x,y,z...}、個別定数記号の集合 C = {a,b,c...}、個別関数記号の集合 F = {f,g,h...} が与えられたとき、「項」は以下のような有限個の規則を適用して得られる式として定義される。例えば、x、y、a、b は基本規則から項であることが明らかである。f(a,x) や g(b,y,x) は基本規則で項とされたものに帰納規則を一回適用することで得られる。f(a,f(a,x)) は帰納規則を2回適用することで得られる。このように様々な項が生成できる。簡単にするため、定数記号は引数(アリティ)がゼロ個の関数記号とみなすことが多く、帰納規則でゼロ引数の項も許容されるようにする。その場合、a() は a と統語論的に同等である。証明を行う目的では、基本規則と帰納規則を明確に区別するため、定数(ゼロアリティ関数)とアリティがゼロより大きい関数記号とを区別する。数学では関数記号ごとに引数の個数(アリティ)を固定することが多いが、統語論的ユニフィケーション問題では一般に関数記号は(有限の)任意個の引数を持ち、同じ関数記号であっても文脈によって異なる個数の引数をとりうる。例えば、f(f(a),f(x,y,z)) はユニフィケーション問題においては正しい項である。置換は、変数から項へのマッピングの有限集合 formula_5 と定義され、1つの変数を2つの異なる項にマッピングすると曖昧さが生じるため、個々のマッピングは一意的でなければならない。項 u への置換の「適用」を formula_6 と記述し、項 formula_7 に出現する各変数 formula_8 を項 formula_9 で置き換えることを意味する。このとき、formula_10 である。例えば、formula_11 となる。一階の項における統語論的ユニフィケーション問題は、同等である可能性のある有限個の式の連言 formula_12 で表される。この問題を解くには、それぞれの潜在的等式の左辺と右辺が統語論的に等価となるような置換 formula_13 を求める必要があり、formula_14 となるようにしなければならない。そのような置換 formula_13 を「単一子」(ユニフィケーション作用素)と呼ぶ。ユニフィケーション問題には解がない場合もある。例えば、formula_16 の単一子は formula_17 である。この場合、となる。変数 "x" を "x" が部分として出現する関数 "x=f(...,x...)" とユニフィケーションしようとする場合、"x" は無限個の項を持たなければならなくなる。これは有限であるとした項の定義と矛盾するため、ユニフィケーションは失敗する。そのためユニフィケーション問題を解くアルゴリズムでは、まず "x" がユニフィケーションしようとする項の中に出現しないかチェックする。これをなどと呼ぶ。2つの項 s と t があるとき、(統語論的)ユニフィケーションは s と t を構造的に等価にする置換を求めるプロセスである。そのような置換が存在する場合、それを s と t の単一子と呼ぶ。理論上、入力された2つの項は無数の単一子を持ちうる。しかし一般的用途では1つの最大汎用単一子を考慮すれば十分である。他の単一子は最大汎用単一子のインスタンスである。一階のユニフィケーションは、一階の項(変数記号や関数記号で構築される項)の統語論的ユニフィケーションである。一方高階ユニフィケーションは、高階の項(何らかの高階の変数を含む項)のユニフィケーションを指す。特定のユニフィケーションアルゴリズムの理論的属性は、入力される項の多様性に依存する。たとえば一階のユニフィケーションは決定可能であり、単一化可能な項群は必ず最大汎用単一子を持つ。しかし高階ユニフィケーションは一般に決定不能であり、最大汎用単一子を持たないことが多い。統語論的ユニフィケーションとは別に、意味論的ユニフィケーションも広く使われている。この2つは、項を「等しい」とみなす方法が異なる。統語論的ユニフィケーションでは、置換によって項が構造的に等価になるようにする。意味論的ユニフィケーションでは、2つの項が何らかの理論において合同であるかで判定する。例えば、交換性と結合性において合同な項を「等しい」とするユニフィケーションをAC-ユニフィケーションと呼ぶ。ユニフィケーションは計算機科学の重要なツールである。特に一階のユニフィケーションは論理プログラミング、プログラミング言語の型システム設計、自動推論などに用いられている。高階ユニフィケーションは定理証明支援で使われている。高階ユニフィケーションに制約を加えたものを実装に採用したプログラミング言語もある。意味論的ユニフィケーションは、背景理論付きSAT (SMT) を解くアルゴリズムや項書き換えアルゴリズムでよく使われている。p と q が一階述語論理の文とする。subst(U,p) は置換 U を文 p に適用した結果を意味する。したがって U は p と q にとっての単一子である。p と q のユニフィケーションは両者に U を適用した結果である。例えば L = {p,q} のような文の集合 L があるとする。L についての全単一子を U' としたとき、L に U を適用したものにある置換 s を適用した結果が L に U' を適用した結果と同じなら、単一子 U は L の最大汎用単一子と呼ばれる。単一化(ユニフィケーション)の考え方は に代表される論理プログラミングの根底を支える重要な概念である。それは変数の内容の束縛であり、項の構成要素の全体の形式から細部までその同一性を検査する機構である。他のプログラム言語とは異なり、 では = という記号はこの意味を表す。 は、質問としての副目標と、これによって呼び出される述語定義の頭部の単一化が試みられ、頭部の単一化の成功した節のみ選択され、その本体が次の質問になる導出と呼ばれるダイナミックで再帰的な機構によって実行される。一般に型推論アルゴリズムは上記単一化に基づいている。(注1) 最近の や一階述語論理では、変数(変項)はそれ自身を含む項と単一化することはできない。それをすると無限の単一化が発生するためである。ユニフィケーションは型推論でも使われており、例えば関数型言語 で使われている。型推論を行う言語では型に関する情報をいちいち記述する必要がなく、ユニフィケーションはデータ型の誤り検出に使われる。Haskellの式
出典:wikipedia
LINEスタンプ制作に興味がある場合は、
下記よりスタンプファクトリーのホームページをご覧ください。