mirror of
				https://github.com/KevinMidboe/linguist.git
				synced 2025-10-29 17:50:22 +00:00 
			
		
		
		
	
		
			
				
	
	
		
			282 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			282 lines
		
	
	
		
			4.9 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
;;; http://www.angusj.com/sudoku/hints
 | 
						|
;;; http://www.scanraid.com/BasicStrategies.htm
 | 
						|
;;; http://www.sudokuoftheday.com/pages/techniques-overview
 | 
						|
;;; http://www.sudokuonline.us/sudoku_solving_techniques
 | 
						|
;;; http://www.sadmansoftware.com/sudoku/techniques.htm
 | 
						|
;;; http://www.krazydad.com/blog/2005/09/29/an-index-of-sudoku-strategies/
 | 
						|
 | 
						|
;;; #######################
 | 
						|
;;; DEFTEMPLATES & DEFFACTS
 | 
						|
;;; #######################
 | 
						|
 | 
						|
(deftemplate possible
 | 
						|
   (slot row)
 | 
						|
   (slot column)
 | 
						|
   (slot value)
 | 
						|
   (slot group)
 | 
						|
   (slot id))
 | 
						|
   
 | 
						|
(deftemplate impossible
 | 
						|
   (slot id)
 | 
						|
   (slot value)
 | 
						|
   (slot priority)
 | 
						|
   (slot reason))
 | 
						|
   
 | 
						|
(deftemplate technique-employed
 | 
						|
   (slot reason)
 | 
						|
   (slot priority))
 | 
						|
 | 
						|
(deftemplate technique
 | 
						|
   (slot name)
 | 
						|
   (slot priority))
 | 
						|
   
 | 
						|
(deffacts startup
 | 
						|
   (phase grid-values))
 | 
						|
 | 
						|
(deftemplate size-value
 | 
						|
   (slot size)
 | 
						|
   (slot value))
 | 
						|
   
 | 
						|
(deffacts values
 | 
						|
   (size-value (size 1) (value 1))
 | 
						|
   (size-value (size 2) (value 2))
 | 
						|
   (size-value (size 2) (value 3))
 | 
						|
   (size-value (size 2) (value 4))
 | 
						|
   (size-value (size 3) (value 5))
 | 
						|
   (size-value (size 3) (value 6))
 | 
						|
   (size-value (size 3) (value 7))
 | 
						|
   (size-value (size 3) (value 8))
 | 
						|
   (size-value (size 3) (value 9))
 | 
						|
   (size-value (size 4) (value 10))
 | 
						|
   (size-value (size 4) (value 11))
 | 
						|
   (size-value (size 4) (value 12))
 | 
						|
   (size-value (size 4) (value 13))
 | 
						|
   (size-value (size 4) (value 14))
 | 
						|
   (size-value (size 4) (value 15))
 | 
						|
   (size-value (size 4) (value 16))
 | 
						|
   (size-value (size 5) (value 17))
 | 
						|
   (size-value (size 5) (value 18))
 | 
						|
   (size-value (size 5) (value 19))
 | 
						|
   (size-value (size 5) (value 20))
 | 
						|
   (size-value (size 5) (value 21))
 | 
						|
   (size-value (size 5) (value 22))
 | 
						|
   (size-value (size 5) (value 23))
 | 
						|
   (size-value (size 5) (value 24))
 | 
						|
   (size-value (size 5) (value 25)))
 | 
						|
   
 | 
						|
;;; ###########
 | 
						|
;;; SETUP RULES
 | 
						|
;;; ###########
 | 
						|
 | 
						|
;;; ***********
 | 
						|
;;; stress-test
 | 
						|
;;; ***********
 | 
						|
 | 
						|
(defrule stress-test
 | 
						|
   
 | 
						|
   (declare (salience 10))
 | 
						|
   
 | 
						|
   (phase match)
 | 
						|
   
 | 
						|
   (stress-test)
 | 
						|
   
 | 
						|
   (priority ?last)
 | 
						|
   
 | 
						|
   (not (priority ?p&:(> ?p ?last)))
 | 
						|
   
 | 
						|
   (technique (priority ?next&:(> ?next ?last)))
 | 
						|
   
 | 
						|
   (not (technique (priority ?p&:(> ?p ?last)&:(< ?p ?next))))
 | 
						|
   
 | 
						|
   =>
 | 
						|
   
 | 
						|
   (assert (priority ?next)))
 | 
						|
   
 | 
						|
;;; *****************
 | 
						|
;;; enable-techniques
 | 
						|
;;; *****************
 | 
						|
 | 
						|
(defrule enable-techniques
 | 
						|
 | 
						|
   (declare (salience 10))
 | 
						|
   
 | 
						|
   (phase match)
 | 
						|
   
 | 
						|
   (size ?)
 | 
						|
   
 | 
						|
   (not (possible (value any)))
 | 
						|
   
 | 
						|
   =>
 | 
						|
   
 | 
						|
   (assert (priority 1)))
 | 
						|
 | 
						|
;;; **********
 | 
						|
;;; expand-any
 | 
						|
;;; **********
 | 
						|
 | 
						|
(defrule expand-any
 | 
						|
 | 
						|
   (declare (salience 10))
 | 
						|
 | 
						|
   (phase expand-any)
 | 
						|
   
 | 
						|
   ?f <- (possible (row ?r) (column ?c) (value any) (group ?g) (id ?id))
 | 
						|
  
 | 
						|
   (not (possible (value any) (id ?id2&:(< ?id2 ?id))))
 | 
						|
   
 | 
						|
   (size ?s)
 | 
						|
   
 | 
						|
   (size-value (size ?as&:(<= ?as ?s)) (value ?v))
 | 
						|
   
 | 
						|
   (not (possible (row ?r) (column ?c) (value ?v)))
 | 
						|
  
 | 
						|
   (not (and (size-value (value ?v2&:(< ?v2 ?v)))
 | 
						|
               
 | 
						|
             (not (possible (row ?r) (column ?c) (value ?v2)))))
 | 
						|
   
 | 
						|
   =>
 | 
						|
   
 | 
						|
   (assert (possible (row ?r) (column ?c) (value ?v) (group ?g) (id ?id))))
 | 
						|
   
 | 
						|
;;; *****************
 | 
						|
;;; position-expanded
 | 
						|
;;; *****************
 | 
						|
 | 
						|
(defrule position-expanded
 | 
						|
 | 
						|
   (declare (salience 10))
 | 
						|
 | 
						|
   (phase expand-any)
 | 
						|
   
 | 
						|
   ?f <- (possible (row ?r) (column ?c) (value any) (group ?g) (id ?id))
 | 
						|
     
 | 
						|
   (size ?s)
 | 
						|
   
 | 
						|
   (not (and (size-value (size ?as&:(<= ?as ?s)) (value ?v))
 | 
						|
   
 | 
						|
             (not (possible (row ?r) (column ?c) (value ?v)))))
 | 
						|
 | 
						|
   =>
 | 
						|
   
 | 
						|
   (retract ?f))
 | 
						|
   
 | 
						|
;;; ###########
 | 
						|
;;; PHASE RULES
 | 
						|
;;; ###########
 | 
						|
 | 
						|
;;; ***************
 | 
						|
;;; expand-any-done
 | 
						|
;;; ***************
 | 
						|
 | 
						|
(defrule expand-any-done
 | 
						|
 | 
						|
   (declare (salience 10))
 | 
						|
 | 
						|
   ?f <- (phase expand-any)
 | 
						|
 | 
						|
   (not (possible (value any)))
 | 
						|
   
 | 
						|
   =>
 | 
						|
   
 | 
						|
   (retract ?f)
 | 
						|
   
 | 
						|
   (assert (phase initial-output))
 | 
						|
   (assert (print-position 1 1)))
 | 
						|
   
 | 
						|
;;; ***********
 | 
						|
;;; begin-match
 | 
						|
;;; ***********
 | 
						|
 | 
						|
(defrule begin-match
 | 
						|
 | 
						|
   (declare (salience -20))
 | 
						|
   
 | 
						|
   ?f <- (phase initial-output)
 | 
						|
      
 | 
						|
   =>
 | 
						|
   
 | 
						|
   (retract ?f)
 | 
						|
   
 | 
						|
   (assert (phase match)))
 | 
						|
 | 
						|
;;; *****************
 | 
						|
;;; begin-elimination
 | 
						|
;;; *****************
 | 
						|
 | 
						|
(defrule begin-elimination
 | 
						|
 | 
						|
   (declare (salience -20))
 | 
						|
   
 | 
						|
   ?f <- (phase match)
 | 
						|
   
 | 
						|
   (not (not (impossible)))
 | 
						|
   
 | 
						|
   =>
 | 
						|
   
 | 
						|
   (retract ?f)
 | 
						|
   
 | 
						|
   (assert (phase elimination)))
 | 
						|
 | 
						|
;;; *************
 | 
						|
;;; next-priority
 | 
						|
;;; *************
 | 
						|
 | 
						|
(defrule next-priority
 | 
						|
 | 
						|
   (declare (salience -20))
 | 
						|
   
 | 
						|
   (phase match)
 | 
						|
   
 | 
						|
   (not (impossible))
 | 
						|
   
 | 
						|
   (priority ?last)
 | 
						|
   
 | 
						|
   (not (priority ?p&:(> ?p ?last)))
 | 
						|
   
 | 
						|
   (technique (priority ?next&:(> ?next ?last)))
 | 
						|
   
 | 
						|
   (not (technique (priority ?p&:(> ?p ?last)&:(< ?p ?next))))
 | 
						|
   
 | 
						|
   =>
 | 
						|
   
 | 
						|
   (assert (priority ?next)))
 | 
						|
 | 
						|
;;; ************
 | 
						|
;;; begin-output
 | 
						|
;;; ************
 | 
						|
 | 
						|
(defrule begin-output
 | 
						|
 | 
						|
   (declare (salience -20))
 | 
						|
   
 | 
						|
   ?f <- (phase match)
 | 
						|
   
 | 
						|
   (not (impossible))
 | 
						|
   
 | 
						|
   (priority ?last)
 | 
						|
   
 | 
						|
   (not (priority ?p&:(> ?p ?last)))
 | 
						|
 | 
						|
   (not (technique (priority ?next&:(> ?next ?last))))
 | 
						|
   
 | 
						|
   =>
 | 
						|
   
 | 
						|
   (retract ?f)
 | 
						|
   
 | 
						|
   (assert (phase final-output))
 | 
						|
   (assert (print-position 1 1)))
 | 
						|
 | 
						|
   
 | 
						|
 | 
						|
  
 | 
						|
    
 | 
						|
   
 | 
						|
   
 | 
						|
   
 | 
						|
   
 | 
						|
   
 | 
						|
   
 | 
						|
   
 | 
						|
   
 | 
						|
   
 |