Haskell を使用してリストに推移閉包を生成する必要があります。
これまでのところ、私はこれを得ました:
import Data.List
qq [] = []
qq [x] = [x]
qq x = vv (sort x)
vv (x:xs) = [x] ++ (member [x] [xs]) ++ (qq xs)
member x [y] = [(x1, y2) | (x1, x2) <- x, (y1, y2) <- qq (y), x2 == y1]
出力 1:
*Main> qq [(1,2),(2,3),(3,4)]
[(1,2),(1,3),(1,4),(2,3),(2,4),(3,4)]
出力 2:
*Main> qq [(1,2),(2,3),(3,1)]
[(1,2),(1,3),(1,1),(2,3),(2,1),(3,1)]
問題は2番目の出力にあります。新しく生成されたリストで追加の推移閉包をチェックする代わりに、単に結果を返します。
Haskell コードのプロトタイプを作成するために、次のPython コードを使用しました。
def transitive_closure(angel):
closure = set(angel)
while True:
new_relations = set((x,w) for x,y in closure for q,w in closure if q == y)
closure_until_now = closure | new_relations
if closure_until_now == closure:
break
closure = closure_until_now
return closure
print transitive_closure([(1,2),(2,3),(3,1)])
出力:
set([(1, 2), (3, 2), (1, 3), (3, 3), (3, 1), (2, 1), (2, 3), (2, 2), (1, 1)])
これは、Haskell 関数で必要な正しい出力です。
Haskell コードで同じことを行うには? if
( Python コードから Haskell コードへのステートメントを再作成する必要があります)