;;;; Rules and problems based on the Logic theorist


(index-brules '((<- (theorem (or (not (or ?a ?a)) ?a)))
		(<- (theorem (or (not ?a) (or ?b ?a))))
		(<- (theorem (or (not (or ?a ?b)) (or ?b ?a))))
		(<- (theorem (or (not (or ?a (or ?b ?c)))(or ?b (or ?a ?c)))))
		(<- (theorem (or (not (or (not ?a) ?b)) (or (not (or ?c ?a))(or ?c ?b)))))
		(<- (theorem ?x) (theorem (or (not ?y) ?x)) (theorem ?y))
		(<- (theorem (or (not ?x) ?z))
		    (theorem (or (not ?y) ?z)) (theorem (or (not ?x) ?y)))))

(defun replace-implies (a)
  (cond ((not (consp a)) a)
	((eq (first a) 'implies)
	 `(or (not ,(replace-implies (second a))) ,(replace-implies (third a))))
	(T (cons (replace-implies (first a))
		 (replace-implies (rest a))))))
(setf lt-problems
      '((implies (implies p (not p)) (not p))
	(implies q (implies p q))
	(implies (implies p (not q))(implies q (not p)))
	(implies (implies p (implies q r))(implies q (implies p r)))
	(implies (implies q r)(implies (implies p q)(implies p r)))
	(implies (implies p q) (implies (implies q r)(implies p r)))
	(implies p (or p p))
	(implies p p)
	(or (not p) p)
	(or p (not p))
	(implies p (not (not p)))
	(or p (not (not (not p))))
	(implies (not (not p)) p)
	(implies (implies (not p) q)(implies (not q) p))
	(implies (implies p q)(implies (not q)(not p)))
	(implies (implies (not q)(not p))(implies p q))
	(implies (implies (not p) p) p)
	(implies p (or p q))
	(implies (not p) (implies p q))
	(implies p (implies (not p) q))
	(or p (implies (or p q) q))
	(or (not p) (implies (implies p q) q))
	(implies p (implies (implies p q) q))
	(implies (or p (or q r))(or p (or r q)))
	(implies (or p (or q r))(or (or p q) r))
	(implies (or (or p q) r)(or p (or q r)))
	(implies (implies q r)(implies (or p q)(or r p)))
	(implies (implies q r)(implies (or q p)(or p r)))
	(implies (implies q r)(implies (or q p)(or r p)))
	(implies (or p (or p q)) (or p q))
	(implies (or q (or p q)) (or p q))
	(implies (or (not p)(implies p q)) (implies p q))
	(implies (implies p (implies p q)) (implies p q))
	(implies (not (or p q))(not p))
	(implies (not (or p q))(not q))
	(implies (not (or p q))(or (not p) q))
	(implies (not (or p q))(or p (not q)))
	(implies (not (or p q))(or (not p) (not q)))
	(implies (not (implies p q))(implies (not p) q))
	(implies (not (implies p q))(implies p (not q)))
	(implies (not (implies p q))(implies (not p)(not q)))
	(implies (not (implies p q))(implies q p))
	(implies (or p q)(implies (not p) q))
	(implies (implies (not p) q) (or p q))
	(implies (not p) (implies (or p q) q))
	(implies (not q) (implies (or p q) p))
	(implies (not p)(implies q (implies (implies p q) q)))
	(implies (implies p q)(implies (implies (not p) q) q))
	(implies (or p q)(implies (implies p q) q))
	(implies (implies p q)(implies (or p q) q))
	(implies (or p q) (implies (or (not p) q) q))
	(implies (or p q)(implies (or p (not q)) p))))

(setf lt-problems (mapcar #'(lambda (problem) (list 'theorem (replace-implies problem)))
			  lt-problems))

; Thirty problems solvable within a depth limit of 3 on chaining rules together
(setf lt-problems-depth3 (mapcar #'(lambda (i) (elt lt-problems (1- i)))
			   '(1 2 3 4 5 6 7 8 9 10 11 18 19 20 21 22 23 24 25 26 27 28 31 44 46 47 48 49 51 52)))


