I coded every(pred,ens) in Maple. No problem:
> every := proc(pred,ens)
local i, res;
res := true;
for i to nops(ens) do
if not(pred(ens[i])) then
res := false; break; fi;
od;
res;
end:
> every(isprime,{2,5,7,11});
true
> every(isprime,{2,5,7,9,11});
false
In Mathematica, just to see. Same style, no problem:
In[1]: every[pred_,ens_] :=
Module[{res = True},
Do[If[Not[pred[ens[[i]]]], (res = False; Break)],
{i,1,Length[ens]}];
res]]
In[2]: every[PrimeQ,{2,5,7,9,11}]
Out[2]: False
Then I turned to Maple for some(pred,E) using every. I know I can
do it from scratch, but I *want* to use every for didactic reasons
about negation:
> some := proc(pred,ens)
not(every(x->not(pred(x)),ens))
end:
> some(isprime,{4,8,6,9,5,8});
Error, (in every) cannot evaluate boolean ????????
Ooops. Let's try it with Mathematica:
In[3]: some[pred_,ens_] := Not[every[Function[x,Not[pred[x]]],ens]]]
In[4]: some[PrimeQ,{4,8,6,9,5,8}] (* ok *)
Out[4]: True
Of course, the neat solution with Mathematica uses typed
pattern-matching:
some[pred_,ens_] := MemberQ[ens,x_?pred]
The Scheme solution [of course] works perfectly:
(define (some? pred ens)
(not (every? (lambda (x) (not (pred x))) ens)))
Can someone explain me:
i) why my Maple solution does not work (I even tried with unapply
which seems to modelize lambda-functions, also with proc).
ii) where I can find exact semantics for the Maple programming
language [page number appreciated] explaining this behaviour.
Thanks a lot,
Jean-Paul Roy
Dept. Informatique
Faculte des Sciences de Nice
http://deptinfo.unice.fr/~roy