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 |

2007-04-03

L-99 (48)

| 21:56 | L-99 (48) - わだばLisperになる を含むブックマーク はてなブックマーク - L-99 (48) - わだばLisperになる

L-99 48問目に挑戦 - L-99:Ninety-Nine Lisp Problems

P48

解答
;;; Common Lisp
(load "./make-truth-table")

(defun table (size expr)
  (mapcar #'(lambda (item)
	      `(,@item ,(apply expr item)))
	  (make-truth-table size)))

(defun pp-table (lst)
  (dolist (l lst)
    (format t "~{~A ~} -> ~{~A~}~%" (butlast l) (last l))))

;;; Scheme
(load "./make-truth-table")

(define table
  (lambda (size expr)
    (map (lambda (item)
	   `(,@item ,(apply expr item)))
	 (make-truth-table size #t #f))))

(define pp-table
  (lambda (lst)
    (let loop ((l lst))
      (if (null? l)
	  (values)
	  (let ((m (car l)))
	    (format #t "~A -> ~A~%" (drop-right m 1) (last m))
	    (loop (cdr l)))))))

P47は、与える論理式を中間記法で与えられるようにす

るという問題。これは自分の手に余るので、後回し後回

し。それで、P48は真理表のテーブルをリストで与える

ように拡張せよ、というもの。

ちょっとした疑問があって、それは問題では、[A,B,C]

というようにリストを与えるようになっているところ。

Prologでは、こういう表現で良いのかもしれないけれど、

真偽表なので、真か偽かの2値しか取らない筈であり、

要素の数が分かれば良いのではないかしらと思ったり。

そんな訳で、要素の数だけ指定するように作ってみた。