削除された内容 追加された内容
→‎コード例: lang="text"
タグ: 2017年版ソースエディター
大黒学 (会話 | 投稿記録)
ソルバーモジュールを使ったコード例の追加など。
36行目:
 
ルールにはバックトラックが可能なものとそうでないものとがあり、バックトラックが可能なルールを書くことによって、非決定的な述語を定義することができる。非決定的な関数は、定義することができない。
 
Picatは[[制約プログラミング]]をサポートしている。「ソルバーモジュール」と呼ばれる、<code>cp</code>(Constraint Programming)、<code>sat</code>(Satisfiability)、<code>mip</code>(Mixed Integer Programming)という三つのモジュールのいずれかをインポートすることによって、[[制約充足問題]]を記述することができるようになる。
 
==コード例==
45 ⟶ 47行目:
</source>
 
次の例は、最大公約を求めが、空リストまたは引数がすべての要素が0であるリストならば成功す<code>gcmallzero</code>という関数述語を定義するプログラムである。
 
<pre>
allzero([]) => true.
allzero([0|T]) => allzero(T).
</pre>
 
次の例は、[[最大公約数]]を求める<code>gcm</code>という関数を定義するプログラムである。
 
<pre>
51 ⟶ 60行目:
gcm(N, M) = G, M >= 1 => G = gcm(M, N mod M).
</pre>
 
次の例は、ソルバーモジュールとして<code>cp</code>を使用して、[[部分和問題]]の解をすべて出力するプログラムである。
 
<pre>
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.
</pre>
 
このプログラムは、{2, 3, 5, 8, 13, 21, 34}という集合の部分集合のうちで、要素の和が50になるものを求めるという部分和問題の解をすべて出力する(解は3個存在する)。このプログラムが出力する解の一つである<code>[0,1,0,0,1,0,1]</code>というリストは、{3, 13, 34}という部分集合を意味している。
 
==脚注==
64 ⟶ 89行目:
|publisher = Springer International Publishing
|isbn = 978-3-319-25881-2
}}
*{{Cite web
|author = 大黒学
|date = 2017
|title = Picat実習マニュアル
|url = http://tutorial.jp/prog/picat/picatman.pdf
|format = PDF
|accessdate = 2018-03-24
}}