`

使用Ruby amb解决说谎者谜题

阅读更多

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

    Ruby本来就有call/cc,因此也可以实现amb操作符,网上已经有一个实现了:

<!---->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


    这一段代码与scheme宏实现amb是完全相同的:

<!---->(define amb - fail  ' *)

(define initialize
- amb - fail
  (
lambda  ()
    (set! amb
- fail
      (
lambda  ()
        (error 
" amb tree exhausted " )))))

(initialize
- amb - fail)
(define call
/ cc call - with - current - continuation)
(define
- syntax amb
  (syntax
- rules ()
    ((amb alt  )
     (let ((prev
- amb - fail amb - fail))
       (call
/ cc
        (
lambda  (sk)

          (call
/ cc
           (
lambda  (fk)
             (set! amb
- fail
                   (
lambda  ()
                     (set! amb
- fail prev - amb - fail)
                     (fk 
' fail)))
             (sk alt))) 
             
             (prev
- amb - fail)))))))

    回到谜题,从题意可知每个姑娘的两句话的异或结果为true,并且姑娘的排名肯定不会相同,因此定义两个辅助过程:

<!---->require  ' amb '
def  distinct?(items)
  items.uniq
== items
end
def  xor(exp1,exp2)
 (exp1 
or  exp2)  and  !(exp1  and  exp2)
end

    剩下的完全就是将题目翻译成代码即可了,没有多少可以解释的东西:

<!---->amb = Amb.new
betty
= amb.choose( * [ 1 , 2 , 3 , 4 , 5 ])
ethel
= amb.choose( * [ 1 , 2 , 3 , 4 , 5 ])
joan
= amb.choose( * [ 1 , 2 , 3 , 4 , 5 ])
kitty
= amb.choose( * [ 1 , 2 , 3 , 4 , 5 ])
marry
= amb.choose( * [ 1 , 2 , 3 , 4 , 5 ])

amb.require(xor(kitty
== 2 ,betty == 3 ))
amb.require(xor(ethel
== 1 ,joan == 2 ))
amb.require(xor(joan
== 3 ,ethel == 5 ))
amb.require(xor(kitty
== 2 ,marry == 4 ))
amb.require(xor(marry
== 4 ,betty == 1 ))
amb.require(distinct?([betty,ethel,joan,kitty,marry]))
puts 
" betty:#{betty} ethel:#{ethel} joan:#{joan} kitty:#{kitty} marry:#{marry} "


    答案就是:
    betty:3 ethel:5 joan:2 kitty:1 marry:4   

    最后给出一个Prolog的解答:

<!---->notmember(A,[]).
notmember(A,[B
| L]): -
  A\
== B,
  notmember(A,L).
distinct([A,B,C,D,E]):
-
   notmember(A,[B,C,D,E]),
   notmember(B,[A,C,D,E]),
   notmember(C,[A,B,D,E]),
   notmember(D,[A,B,C,E]),
   notmember(E,[A,B,C,D]).
xor(Exp1,Exp2):
-
   (Exp1;Exp2),\
+  (Exp1,Exp2).
solve(Betty,Ethel,Joan,Kitty,Marry):
-   
   X
= [ 1 , 2 , 3 , 4 , 5 ],
   member(Betty,X),
   member(Ethel,X),
   member(Joan,X),
   member(Kitty,X),
   member(Marry,X),
   distinct([Betty,Ethel,Joan,Kitty,Marry]),
   xor(Kitty
= : = 2 ,Betty = : = 3 ),
   xor(Ethel
= : = 1 ,Joan = : = 2 ),
   xor(Joan
= : = 3 ,Ethel = : = 5 ),
   xor(Kitty
= : = 2 ,Marry = : = 4 ),
   xor(Marry
= : = 4 ,Betty = : = 1 ).


分享到:
评论

相关推荐

    安邦信AMB100系列通用变频器说明书.pdf

    安邦信AMB100系列通用变频器说明书详尽地涵盖了从设备基础信息到使用、维护的各个方面,旨在帮助用户充分利用变频器的功能,确保设备在各种工况下的高效、安全运行。遵循说明书的指导,用户可以更好地理解和操作变频...

    AMB说明书 很好用的

    它作为连接产品的第一手资料,能够指导用户快速上手,减少因误操作带来的风险,同时也能为使用者提供基本的问题解决路径。对于AMB产品来说,一个实用且详尽的使用手册是至关重要的。用户通过手册能够了解产品的工作...

    AMB-G7/P7系列通用变频器使用说明书.pdf

    安邦信公司生产的AMB-G7/P7系列通用变频器是一款针对工业自动化领域设计的高...通过这些详尽的安全说明和操作指南,用户可以更好地了解如何安全有效地使用AMB-G7/P7系列通用变频器,以保证设备的稳定运行和用户的安全。

    变频器说明书系列-AMB300_15037162627.pdf

    AMB300系列变频器提供了详尽的故障对策,包括故障内容、故障分析以及各种故障状况下的应对措施,使用户能够快速地诊断和解决问题。 此外,变频器的保养和维护也是确保长期稳定运行的重要环节,用户需要进行日常维护...

    AMBITION安邦信AMB-HVI高压系列变频器说明书.rar

    在工业自动化领域,变频器作为一项关键...通过对这份说明书的深入学习和正确应用,用户不仅能够提升AMB-HVI高压系列变频器的使用效率,而且还能有效预防和解决可能出现的问题,从而确保整个生产系统的稳定、高效运行。

    变频器说明书系列-AMB100_15037162627.pdf

    变频器的外围设备连接、主回路端子和控制回路端子的接线方法、键盘操作、功能代码参数说明、试运行操作和故障对策是AMB100系列变频器使用过程中需要重点关注的几个方面。 在接线方面,首先需要了解变频器各部件的...

    AMB500F与AMB800F的区别.pdf.pdf

    在探讨AM500F与AMB800F两款变频器的区别之前,首先需了解变频器的基本概念。变频器是一种电力控制设备,主要作用是通过改变交流电的频率来控制交流电动机的速度。在工业自动化领域,变频器是实现电机变速运行、节能...

    安邦信AMB-G9P9(新)使用说明书.rar

    在现代科技日新月异的时代,各种电子产品层出不穷,而用户手册或使用说明书是连接产品与使用者的重要桥梁。本篇文章将详细解读安邦信AMB-G9P9(新)的使用说明书,帮助用户更好地理解和操作这款设备。 首先,安邦信...

    敏俊物联MJIOT-AMB-03模块AT指令集V1.0

    根据提供的文件内容,以下是对MJIOT-AMB-03模块AT指令集V1.0的详细介绍...综上所述,MJIOT-AMB-03模块是一个功能全面、高度集成的WiFi解决方案,通过AT指令集可实现透传模式下的灵活应用,适合物联网领域的开发和应用。

    AMB100说明书

    AMB100说明书

    安邦信AMB-V11.rar

    AMB-V11使用手册(定).pdf是该控制器的操作指南,涵盖了从硬件安装到软件配置的全过程。手册首先会介绍控制器的基本结构和硬件接口,包括输入/输出端口、通信接口以及电源连接等,帮助用户了解设备的物理布局和接线...

    安邦信AMB500F\AMB800F产品样本.jpg

    安邦信AMB500F\AMB800F产品样本jpg,安邦信公司产品宣传折页。欢迎各位下载。

    AMBITION安邦信AMB-E11系列变频器说明书.rar

    描述"AMBITION安邦信AMB-E11系列变频器说明书"进一步确认了这是一个指导用户如何操作、安装、配置和维护AMB-E11系列变频器的文档,对于设备的使用者和维护人员来说非常重要。 **变频器基本知识** 变频器是一种电力...

    8种电弧模型的matlab实现的模型amb2.zip

    本资料包"8种电弧模型的matlab实现的模型amb2.zip"包含了多种电弧模型的MATLAB实现,有助于深入理解电弧行为和优化相关应用。 首先,我们看到`arc_demo.mdl`,这是一个MATLAB Simulink模型文件,很可能包含了8种...

    安邦信_AMB300说明书.pdf

    安邦信_AMB300说明书pdf,安邦信_AMB300说明书  一、安装现场 安装现场应满足如下条件: 1、 室内通风良好。 2、 环境温度 -10°C~ 40°C,( 40°C~50°C 时请降额使用) 3、 尽量避免高温多湿,湿度小于 90%RH,无...

    安邦信 AMB-G9系列通用型产品说明书(新).rar

    《安邦信 AMB-G9系列通用型产品说明书》详细解析 安邦信是一家在电力电子设备领域享有盛誉的企业,其AMB-G9系列通用型产品是他们为满足市场需求而推出的创新产品。这款产品的说明书是用户正确操作和维护设备的重要...

    AMB变频器规格尺寸说明(1212).pdf

    AMB变频器是一种用于交流电机调速控制的电力电子设备,它能够将交流电源转换成可以调节频率的交流电源供电机使用,从而实现对电机速度的精确控制。AM800F系列和AMB500F系列是其中的两种型号,它们各自具有不同的规格...

    欧盟CE认证AMB500F.jpg

    欧盟CE认证AMB500Fjpg,欧盟CE认证AMB500F

Global site tag (gtag.js) - Google Analytics