Picat

出典: フリー百科事典『ウィキペディア(Wikipedia)』
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}という部分集合を意味している。

脚注[編集]

  1. ^ 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 

外部リンク[編集]

関連項目[編集]