Picat
パラダイム | マルチパラダイム: 論理プログラミング、関数プログラミング、命令型プログラミング |
---|---|
登場時期 | 2013年 |
設計者 | 周能法(Neng-Fa Zhou)、Jonathan Fruhman |
型付け | 動的型付け |
影響を受けた言語 | Prolog |
ウェブサイト | http://www.picat-lang.org/ |
拡張子 | .pi |
Picatは、論理プログラミングをベースとするマルチパラダイムの汎用プログラミング言語である。制約論理プログラミング言語であるen:B-Prologを発展させることによって開発された。
概要
[編集]Picatは、周能法(Neng-Fa Zhou)およびJonathan Fruhmanによって設計された。2012年12月に仕様が公開され、2013年5月に処理系がリリースされた[1]。
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}という部分集合を意味している。
脚注
[編集]- ^ Kjellerstrand, Håkan. “My First Look At Picat as a Modeling Language for Constraint Solving and Planning” (PDF). 2017年7月11日閲覧。
参考文献
[編集]- Neng-Fa Zhou; Håkan Kjellerstr; Jonathan Fruhman (2015). Constraint Solving and Planning with Picat. Springer International Publishing. ISBN 978-3-319-25881-2