Hatena::Groupcadr

わだばLisperになる このページをアンテナに追加 RSSフィード

2004 | 12 |
2005 | 01 | 02 | 07 | 10 | 11 |
2006 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2007 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2008 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2009 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2010 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 08 | 09 | 10 | 11 | 12 |
2011 | 01 | 02 | 03 | 04 | 05 | 06 | 07 | 11 |

2008-03-24

ArcでL-99 (P46 真偽値表)

| 09:25 | ArcでL-99 (P46 真偽値表) - わだばLisperになる を含むブックマーク はてなブックマーク - ArcでL-99 (P46 真偽値表) - わだばLisperになる

前回で、算術篇は終わり、今回から論理と符号篇です。ということで、番号が飛んでP46から。

これまでの問題を細かく分けると、43問あるので2問足りてない感じです。

今回のお題は、2引数のand、or、nand、nor、xor、impl、equを定義を定義し、真偽値表を出力するプログラムで結果を表示させるというものです。

implがなんだか良く分かりませんでしたが、検索してみると、IMPLY B (AならばB)のことのようなので、それらしいものを作ってみましたが、これで良いのか自信がありません。

(table t nil *impl)
;=> ====
;   t : t => t
;   t : nil => nil
;   nil : t => t
;   nil : nil => t
;   nil

(def *nand (a b) (no:and a b))
(def *nor (a b) (no:or a b))
(set *and ~*nand)
(set *or ~*nor)
(def *equ (a b) (*or (*and a b) (*and no.a no.b)))
(set *xor  ~*equ)
(def *impl (a b) (*or no.a b))

(def perm (lst)
  ((afn (u res)
     (if no.u
         res
         (self cdr.u `(,@res ,@(map [list car.u _] lst)))))
   lst () ))

(def table (a b f)
  (prn "\n====")
  (each (a b) (perm (list a b))
    (prf "#a : #b => ~ \n" (f a b))))