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 件のコメント:
コメントを投稿