Subject: Re: How To make '(--a) equals 'a
From: Erik Naggum <erik@naggum.no>
Date: 2000/04/13
Newsgroups: comp.lang.lisp
Message-ID: <3164645518513769@naggum.no>

* David <tiand8@cs.man.ac.uk>
| I am a beginner in Lisp. Recently I have been doing a programming
| exercise in Lisp which is to build a test-tree using a so-called ID3
| algorithm in A.I. one of the smaller tasks to solve this problem is to
| make "not not a" (ie. '(--a) ) equals "a"; where "a" is any atom in
| Lisp. This is trivial in Maths, but to make this equivalence work in Lisp
| seems very tricky to me. My main difficulty is that I don't know how to
| separate '(--a) into "-", "-" and "a". once I know how to do this the
| problem is straight forward.

  if you use a richer character set, you can use the ¬ operator (found in
  ISO 8859-1, or "ISO Latin 1", also known among Microsoft victims as "the
  ANSI character set"), and you can teach your Common Lisp reader to make
  that a single-character operator that either returns itself or returns
  the "not" operator already in the language, listifying its argument like
  quote (') does.

(defun not-reader (stream char)
  (list 'not (read stream nil nil t)))

(set-macro-character #\¬ #'not-reader nil)

'¬¬a
=> (not (not a))

  simplifying this expression can now be done at the semantic level, which
  basically entails walking over your expressions looking for not forms and
  replacing the form with the cadadr of the form.

  the normal evaluation rules in Common Lisp makes (not (not a)) the
  canonical true boolean value, t, for any non-nil a, and nil for nil.

  don't know if this answered your question, it's kind of vague.

#:Erik