Picatは、論理プログラミングをベースとするマルチパラダイムの汎用プログラミング言語である。制約論理プログラミング言語である:en:B-Prologを発展させることによって開発された。

概要

Picatは、周能法(Neng-Fa Zhou)およびJonathan Fruhmanによって設計された。2012年12月に仕様が公開され、2013年5月に処理系がリリースされた。

Picatという名称は、次の単語の頭文字に由来する。

Pattern-matching Imperative Constraints Actors Tabling

Picatのプログラムは、述語または関数の定義から構成される。述語または関数は、1個以上のルールによって定義される。

ルールにはバックトラックが可能なものとそうでないものとがあり、バックトラックが可能なルールを書くことによって、非決定的な述語を定義することができる。非決定的な関数は、定義することができない。

Picatは制約プログラミングをサポートしている。「ソルバーモジュール」と呼ばれる、cp(Constraint Programming)、sat(Satisfiability)、mip(Mixed Integer Programming)という三つのモジュールのいずれかをインポートすることによって、制約充足問題を記述することができるようになる。

コード例

Hello worldは、次のように書くことができる。

main => println('Hello, World!').

次の例は、引数が、空リストまたはすべての要素が0であるリストならば成功する、allzeroという述語を定義するプログラムである。

allzero([]) => true. allzero([0|T]) => allzero(T).

次の例は、最大公約数を求めるgcmという関数を定義するプログラムである。

gcm(N, 0) = N. gcm(N, M) = G, M >= 1 => G = gcm(M, N mod M).

次の例は、ソルバーモジュールとしてcpを使用して、部分和問題の解をすべて出力するプログラムである。

import cp.

subset => V = [A, B, C, D, E, F, G], V :: [0, 1], A*2 + B*3 + C*5 + D*8 + E*13 + F*21 + G*34 #= 50, solve(V), print(V), fail.

このプログラムは、{2, 3, 5, 8, 13, 21, 34}という集合の部分集合のうちで、要素の和が50になるものを求めるという部分和問題の解をすべて出力する(解は3個存在する)。このプログラムが出力する解の一つである[0,1,0,0,1,0,1]というリストは、{3, 13, 34}という部分集合を意味している。

脚注

参考文献

外部リンク Picat公式サイト

関連項目 Prolog 論理プログラミング 制約プログラミング 制約論理プログラミング