制約論理プログラミングその2


※上記の広告は60日以上更新のないWIKIに表示されています。更新することで広告が下部へ移動します。

制約論理プログラミングについて その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.