先日は Scheme での非決定性プログラミングの話題を出した (http://saito.hatenablog.jp/entry/20070531/1180609793) けれども、そもそも Scheme を知らない人にはその凄さが伝わらないと思ってウェブ検索してみると Ruby でやっている例もいくつか見られるようだ。 それらを参考にコードをまとめてみた。 class Amb def initialize() @paths = [] end def choose(*prob) if prob.empty? self.fail else callcc{|cc| @paths.push(*prob.map{|trial|proc{cc.call(trial)}}) self.fail } end end def fail()@paths.empty? ? (throw :fail):@pa