六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 59|回复: 0

使用Ruby amb解决说谎者谜题

[复制链接]

升级  28.33%

87

主题

87

主题

87

主题

举人

Rank: 3Rank: 3

积分
285
 楼主| 发表于 2013-1-27 04:45:24 | 显示全部楼层 |阅读模式
    说谎者谜题是sicp4.3.2小节的一道题目,题目本身不难:
五个女生参加一个考试,她们的家长对考试结果过分关注。为此她们约定,在给家里写信谈到考试的时候,每个姑娘都要写一句真话和一句假话。下面是从她们的信里摘抄出来的句子:
Betty : kitty考第二,我只考了第三
Ethel : 你们应该很高兴听到我考了第一,joan第二
joan :   我考第三,可怜的Ethel垫底
kitty:  我第二,marry只考了第四
marry: 我是第四,Betty的成绩最高。
这五个姑娘的实际排名是什么?

    Ruby本来就有call/cc,因此也可以实现amb操作符,网上已经有一个实现了:
<div style="border: 1px solid #cccccc; padding: 4px 5px 4px 4px; background-color: #eeeeee; font-size: 13px; width: 98%;"><!---->class Amb
  
class ExhaustedError < RuntimeError; end
  def initialize
    @fail 
= proc { fail ExhaustedError, "amb tree exhausted" }
  end
  def choose(
*choices)
    prev_fail 
= @fail
    callcc { 
|sk|
      choices.each { 
|choice|
        callcc { 
|fk|
          @fail 
= proc {
            @fail 
= prev_fail
            fk.call(:fail)
          }
          
if choice.respond_to? :call
            sk.call(choice.call)
          
else
            sk.call(choice)
          end
        }
      }
      @fail.call
    }
  end
  def failure
    choose
  end
  
  def 
assert(cond)
    failure unless cond
  end
  alias :require :
assert
end
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表