2

「Learn You a Haskell」をざっと読んでいたところ、このページの一番下に、指定された境界線を持つ直角三角形を表すトリプル (a、b、c) を見つける方法が見つかりました。

ghci> let rightTriangles' = [ (a,b,c) | c <- [1..10], b <- [1..c], a <- [1..b], a^2 + b^2 == c^2, a+b+c == 24]

そして、ループを明示的に使用せずに、同様の方法でLispでこれを行う方法があるかどうか疑問に思っていました。これが私がしたことです-

(defun sq (x) (expt x 2))

(loop for c from 1 to 10 do
    (loop for a from 1 to c do
       (let ((b (- 24 a c)))
          (if (= (sq c) (+ (sq a) (sq b)))
              (format t "~a, ~a, ~a~%" a b c)))))

しかし、明らかにHaskellバージョンほど見栄えがよくなく、a1からc.

4

4 に答える 4

4

CLで集合論のおもちゃライブラリを書いたので、これを試してみることに抵抗できませんでした。http://repo.or.cz/w/flub.git/blob/HEAD:/bachelor-cs/set-theory.lispを参照してください。

(use-package '(:alexandria :bachelor-cs.set-theory))

(defun triangles (h)
  (let ((range (iota h :start 1)))
    (∩ (× (× range range) range)
       (lambda (triangle)
         (destructuring-bind ((a b) c) triangle
           (>= c b a))))))

(defun perimeter (n)
  (lambda (triangle)
    (destructuring-bind ((a b) c) triangle
      (= n (+ a b c)))))

(defun right-triangles (triangle)
  (destructuring-bind ((a b) c) triangle
    (= (* c c) (+ (* a a) (* b b)))))

(∩ (∩ (triangles 10) (perimeter 24)) #'right-triangles) ↦ (((6 8) 10))

これの見苦しい点は、集合演算がバイナリとして定義されているため、三角形が '((ab) c) として表現されていることです。そうそう、解決すべき素敵ななぞなぞを手に入れました: 変数パラメーター リストの集合操作を定義します。

乾杯、マックス

EDIT:集合演算をn-aryにしました。これで、次のように記述できます。

(∩ (× (iota 10 :start 1) (iota 10 :start 1) (iota 10 :start 1))
   (lambda (tri)
     (destructuring-bind (a b c) tri
       (>= c b a)))
   (lambda (tri)
     (destructuring-bind (a b c) tri
       (= 24 (+ a b c))))
   (lambda (tri)
     (destructuring-bind (a b c) tri
       (= (+ (* a a) (* b b)) (* c c)))))

簡単なマクロを追加する場合 →</p>

(defmacro → (args &rest body)
  (let ((g!element (gensym "element")))
    `(lambda (,g!element)
       (destructuring-bind ,args ,g!element
         ,@body))))

あなたは読みやすさの点でHaskellバージョンにかなり近づいています:

(∩ (× (iota 10 :start 1) (iota 10 :start 1) (iota 10 :start 1))
   (→ (a b c) (>= c b a))
   (→ (a b c) (= 24 (+ a b c)))
   (→ (a b c) (= (+ (* a a) (* b b)) (* c c))))
于 2013-05-16T15:48:12.843 に答える