「制約論理プログラミングその2」の編集履歴(バックアップ)一覧はこちら
「制約論理プログラミングその2」(2014/05/09 (金) 11:19:05) の最新版変更点
追加された行は緑色になります。
削除された行は赤色になります。
制約論理プログラミングについて その2です。
まず最初に自作述語を使用した、制約論理プログラミングを作成してみましょう。
以下は、my_minを作ってXにYを条件として加えた時のXの最小値を求めるプログラミングです。
test:-
dlib_require(clp),
X in 0..100,
Y is 50,
my_min(X,Y,Z),
write(Z).
my_min(X,Y,X):-X #> Y,labeling([X]).
my_min関数内でラベリングを行い、第3アリティにXを返して最小値を返しています。
ここで,write(Z)→write(X)に変更するとどうなるでしょうか?
答えは、おなじになります。
なので上記のプログラムは以下のように簡略化できます。
test:-
dlib_require(clp),
X in 0..100,
Y is 50,
my_min(X,Y),
write(X).
my_min(X,Y):-X #> Y,labeling([X]).
それでは例題として座席を推定するプログラムを作成してみましょう。
・座席推論プログラム
問題例:
五つの椅子がある丸テーブルに5人が座ることになりました。
5人の名前は、Andrew、Carol、Jessica、Luke、Tommyです。
ただし、夫々好き嫌いな席と隣に座りたくない人が居るようです。
-CarolはC席に座りたいようです。
-AndrewはA席に座りたくないようです。
-Loc_Carolの右隣はAndrewに座ってもらいたいそうです。
-Carolの両隣にはLukeには座ってもらいたくないそうです。
-TommyはE席に座りたくないようです。
考えられる五人の席順を全て答えなさい。
回答例:
test:-
name(IND,[31]),
dlib_require(clp),
SeatNo=['A','B','C','D','E'],
Loc_Andrew in SeatNo,
Loc_Carol in SeatNo,
Loc_Jessica in SeatNo,
Loc_Luke in SeatNo,
Loc_Tommy in SeatNo,
alldifferent([Loc_Andrew, Loc_Carol,Loc_Jessica,Loc_Luke,Loc_Tommy]),
constraint_loc('C','=',Loc_Carol),
constraint_loc('A','!=',Loc_Andrew),
constraint_loc(Loc_Carol,'+',Loc_Andrew),
constraint_loc(Loc_Carol,'!+',Loc_Luke),
constraint_loc(Loc_Carol,'!-',Loc_Luke),
constraint_loc('E','!=',Loc_Tommy),
Person =[Loc_Andrew,Loc_Carol,Loc_Jessica,Loc_Luke,Loc_Tommy],
labeling(Person),
write_listnl(['%%%%%%%%%%' ,IND,
'Andrew''s seat is ' ,Loc_Andrew ,'.',IND,
'Carol''s seat is ' ,Loc_Carol ,'.',IND,
'Jessica''s seat is ',Loc_Jessica,'.',IND,
'Luke''s seat is ' ,Loc_Luke ,'.',IND,
'Tommy''s seat is ' ,Loc_Tommy,'.']),
fail.
constraint_loc(Loc,'=',Who):-Who #= Loc.
constraint_loc(Loc,'!=',Who):-Who #\= Loc.
constraint_loc(You,'+',Who):-name(You,[A]),B is A+1,name(C,[B]),Who #= C.
constraint_loc('E','+','A').
constraint_loc(You,'-',Who):-name(You,[A]),B is A-1,name(C,[B]),Who #= C.
constraint_loc('A','-','E').
constraint_loc(You,'!+',Who):-name(You,[A]),B is A+1,name(C,[B]),Who #\= C.
constraint_loc(You,'!-',Who):-name(You,[A]),B is A-1,name(C,[B]),Who #\= C.