>>301,302
論理型言語のPrologだと「関係」の表現は以下のような簡潔なコードになる。

 :- op(800, xfx, '==>'). % ボールの移動を表現する演算子 '==>' を宣言
 pitcher ==> catcher. % 命題「ピッチャーからキャッチャーへボールが移動する」を定義。以下同様。
 pitcher ==> batter.
 batter ==> catcher.
 batter ==> fielder1.
 batter ==> fielder2.
 batter ==> fielder3.
 move_ball(X, Y) :- X ==> Y. % 述語「ボールはAからBへ移動する」を定義。以下も同じ。
 move_ball(X, Z) :- X ==> Y, Y ==> Z.

**** 実行してみよう。****

 ?- move_ball(pitcher, fielder2). % ピッチャーから外野手2へボールは移動するか?
 true . % 移動する
 ?- setof(Y, move_ball(pitcher, Y), L). % ピッチャーからどこへボールは送られるのか?
 L = [batter, catcher, fielder1, fielder2, fielder3].
 ?- setof(X, move_ball(X, fielder2), L). % 外野手2はどこからボールを受け取るのか?
 L = [batter, pitcher].
 ?- setof(X, X^move_ball(X, Y), L). 全てのボールの移動を列挙しなさい
 Y = batter,
 L = [pitcher] ;
 Y = catcher,
 L = [batter, pitcher] ;
    :(以下略)

Haskellで同じ問題を解くコードを書いて下さいまし。「論よりコード」です。何ステップで書けますか?