2012/05/19

Paiprolog の出番だ

某問題を解こうと思って Paiprolog の出番だ、と思ったがうまく行かなかった。

(ql:quickload  :paiprolog)

(defpackage :dropquest2012
(:use :cl :paiprolog))

(in-package dropquest2012)

(<-- (member ?item (?item . ?rest)))
(<- (member ?item (?x . ?rest)) (member ?item ?rest))
(<-- (d ?x) (member ?x (0 1 2 3 4 5 6 7 8 9)))

(prolog-collect (?n1 ?n2 ?n3 ?n4 ?n5)
(d ?n1)
(d ?n2)
(d ?n3)
(d ?n4)
(d ?n5)
(is 24 (* ?n1 ?n2))
(is ?n4 (/ ?n2 2))
(is 26 (+ ?n1 ?n2 ?n3 ?n4 ?n5))
(is ?n5 (+ ?n2 ?n3))
(is (+ ?n4 ?n5) (+ ?n1 ?n3)))
;;=> NIL

でも、こうすると動く。

(prolog-collect (?n1 ?n2 ?n3 ?n4 ?n5)
(d ?n1)
(d ?n2)
(d ?n3)
(d ?n4)
(d ?n5)
(is 24 (* ?n1 ?n2))
(is ?n4 (/ ?n2 2))
(is 26 (+ ?n1 ?n2 ?n3 ?n4 ?n5))
(is ?n5 (+ ?n2 ?n3))
;; (is (+ ?n4 ?n5) (+ ?n1 ?n3))
(is ?x (+ ?n4 ?n5))
(is ?x (+ ?n1 ?n3)))
;;=> ((6 4 5 2 9))

なんだろうね。

Series でも解きたくて scan-combination を実装した。

(ql:quickload  :info.read-eval-print.series-ext)

(info.read-eval-print.series-ext:sdefpackage :dropquest2012
(:use :cl))

(in-package dropquest2012)

(collect-first
(choose-if
(lambda (xs)
(destructuring-bind (n1 n2 n3 n4 n5) xs
(and (= (* n1 n2) 24)
(= n4 (/ n2 2))
(= (+ n4 n5) (+ n1 n3))
(= 26 (+ n1 n2 n3 n4 n5))
(= n5 (+ n2 n3)))))
(scan-combination 5 (collect (scan-range :upto 9)))))
;;=> ((6 4 5 2 9))

0 件のコメント: