<div dir="ltr"><div><div><div>Because all-true and all-false are both all-something, they are both written (and), not (or).  If you want something corresponding to (or), you need at-least-one-true or at-least-one-false.  In general, all-true is the negation of at-least-one-false, and all-false is the negation of at-least-one-true.<br><br>On Sat, Jan 3, 2015 at 2:06 PM, Jos Koot <span dir="ltr"><<a href="mailto:jos.koot@gmail.com" target="_blank">jos.koot@gmail.com</a>></span> wrote:<br></div><div class="gmail_extra"><div class="gmail_quote"><blockquote class="gmail_quote" style="margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-left:1ex"><span class="">Matthias, you write:<br>
<br>
  all-true is the same as cannot-find-a-false-on-the-list.<br>
<br>
</span>Then I take an inverse:<br>
<br>
  all-false is the same as cannot-find-a-true-on-the-list.<br>
<br>
But we have (in Racket):<br>
<br>
(and) -> #t<br>
(or) -> #f<br>
<br>
Something is wrong with the inversion. But what?<br>
<br>
Happy new year to all, Jos<br>
<div class="HOEnZb"><div class="h5"><br>
-----Original Message-----<br>
From: users [mailto:<a href="mailto:users-bounces@racket-lang.org">users-bounces@racket-lang.org</a>] On Behalf Of Matthias<br>
Felleisen<br>
Sent: 03 January 2015 03:12<br>
To: Frank Weytjens<br>
Cc: users Users<br>
Subject: Re: [racket] Little Schemer, lat?<br>
<br>
<br>
Frank, happy new year. It's good to hear from people like you because TLS is<br>
for you.<br>
<br>
Now I'd like to say that I am unbelievably unhappy about Chapter 2 but I<br>
could not convince Dan to change the book that much. Let's look at lists in<br>
the "How to Design Programs" way, the TLS for adults if you so wish. Here is<br>
the definition:<br>
<br>
A LAT is either<br>
 -- the empty list<br>
or<br>
 -- a LAT l extended with one ATOM.<br>
<br>
And we don't care what an ATOM is.<br>
<br>
This definition is unusual because it refers to itself. You haven't seen<br>
such definitions in your high school courses, and it's best to make sure<br>
this definition generates some LATs (whatever those are).<br>
<br>
* Clearly one thing is a LAT.  T<br>
- he empty list.<br>
<br>
* Now suppose we take ATOM1 (whatever atoms are) and extend the empty list<br>
with ATOM1.<br>
- What do we get?<br>
<br>
* Yes, we get a different LAT.<br>
- Should we give it a name?<br>
<br>
* Sure, what would you like to call it?<br>
- LAT1.<br>
<br>
* Great name. What do you think happens if we extend LAT1 with ATOM2?<br>
- Then we get LAT2, which is like LAT1 but extended with ATOM2.<br>
<br>
And so on. But the key is, we started by simply defining the empty list to<br>
be a LAT. Note how we also don't need any "Scheme" or "Racket" things to<br>
express the ideas. Plain English and an agreement to treat 'extend with' and<br>
'the empty list" as special phrases.<br>
<br>
Time to look the second aspect of your question. Here is a definition for<br>
LOB:<br>
<br>
A LOB is either<br>
 -- the empty list<br>
or<br>
 -- a LOB extended with one Boolean.<br>
A Boolean is either #t or #f.<br>
<br>
* Are these LOBs?<br>
  the empty list<br>
  the empty list extended with #f<br>
  the empty list extended with #f extended with #t<br>
- Yes they are.<br>
<br>
* Are all Booleans on this list #t<br>
   the empty list extended with #t extended with #t<br>
- They sure are.<br>
<br>
* Are all Booleans on this list #t<br>
   the empty list extended with #t<br>
- Still.<br>
<br>
* Are all Booleans on this list #t<br>
   the empty list<br>
- It all depends on what "are" means. [Famous quote. Who said that?]<br>
<br>
* How many options do we have?<br>
- Two: The answer is either true or false.<br>
<br>
* How do you define the function for answer 1 [true]<br>
- Easy<br>
(define (all-true?-1 lob)<br>
  (cond<br>
    [(null? lob) #t] ;; by definition, right?<br>
    [else (and (true? (car lob)) (all-true?-1 (cdr lob)))])) ;; <--- this is<br>
now functions should be defined<br>
<br>
* What about answer 2 [false]?<br>
- Here is a start:<br>
(define (all-true?-2 lob)<br>
  (cond<br>
    [(null? lob) #f] ;; by definition, right?<br>
    [else ...]))<br>
<br>
* This function works for the empty list but how about lists with one or two<br>
or three ... Booleans?<br>
- For all those, all-true?-1 gives the correct answer.<br>
(define (all-true?-2 lob)<br>
  (cond<br>
    [(null? lob) #f] ;; by definition, right?<br>
    [else (all-true?-1 lob)]))<br>
<br>
* How come?<br>
- Because all-true?-2 makes sure that all-true?-1 never sees the empty list.<br>
<br>
<br>
* But doesn't all-true?-1 look for the empty list?<br>
- Yes, but only after it has seen at least one Boolean.<br>
<br>
* Which answer is simpler, elegant, satisfying?<br>
- The first one. It's a two-line function and it's easily explained.<br>
<br>
* So what is the better choice?<br>
- It's better to say that all Booleans on the empty list are true, even<br>
though there aren't any.<br>
<br>
* Is this weird?<br>
- A little bit but it makes everything easy.<br>
<br>
* So let's use this convention from now on.<br>
- Good.<br>
<br>
That's one explanation for considering it correct to say that the empty list<br>
contains only #t Booleans. Another one:<br>
<br>
  all-true is the same as cannot-find-a-false-on-the-list.<br>
<br>
Can you deal with this explanation? -- Matthias<br>
<br>
<br>
<br>
<br>
<br>
<br>
<br>
On Jan 2, 2015, at 5:58 PM, Frank Weytjens wrote:<br>
<br>
> Happy new year Racketeers,<br>
><br>
> The Little Schemer is my favorite book.<br>
> I have a kind of Sisyphus relationship with it.<br>
> In the preface they advice to not read it, in less then 3 times.<br>
> The jokers! It's more then 3 years I read this book, from time to time.<br>
> Hoping to get further and further, each time.<br>
> I enjoy to start over and over, without completely understanding it.<br>
> Like if: once it 's completely understood, there is no more interesting<br>
stuff on earth.<br>
> This time i got stuck much earlier, then normal, extremely early.<br>
><br>
> (define lat?<br>
>     (lambda (l)<br>
>       (cond<br>
>             ((null? l) #t)<br>
>             ((atom? (car l)) (lat? (cdr l)))<br>
>             (else #f))))<br>
><br>
> An empty list is a list, but is it a lat ?<br>
> If you give an empty list as argument to the lat?-function, the answer<br>
> is yes. But an atom must be a string of characters or numbers, or even<br>
> one character, or a combination of special characters as long as it is<br>
> not an ( or an ). The empty list contains no characters at all, so it<br>
> can not be a list of atoms. It would be OK, if you recur at least<br>
> once. But when you feed an empty list, this is not the case. Then the<br>
> answer of (null? l) should be #f<br>
><br>
> Rewriting the function that way, would never give #t as answer<br>
><br>
> (define lat?<br>
>     (lambda (l)<br>
>       (cond<br>
>             ((null? l) #f)<br>
>             ((atom? (car l)) (lat? (cdr l)))<br>
>             (else #f))))<br>
><br>
><br>
> So an empty list has to be a lat, and it is not.<br>
> Or is it? Then an empty list can be anything.<br>
><br>
><br>
> Thanks,<br>
><br>
> Frank<br>
> ____________________<br>
>  Racket Users list:<br>
>  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
<br>
<br>
____________________<br>
  Racket Users list:<br>
  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
<br>
____________________<br>
  Racket Users list:<br>
  <a href="http://lists.racket-lang.org/users" target="_blank">http://lists.racket-lang.org/users</a><br>
<br>
</div></div></blockquote></div><br></div></div></div></div>