[m-users.] Conjunction as an operator

Volker Wysk post at volker-wysk.de
Mon Oct 14 13:59:27 AEDT 2019


Am Samstag, den 12.10.2019, 18:52 -0500 schrieb Julian Fondren:
> On 2019-10-12 18:29, Volker Wysk wrote:
> > Am Samstag, den 12.10.2019, 17:42 -0500 schrieb Julian Fondren:
> > > On 2019-10-12 17:32, Volker Wysk wrote:
> > > > Hi!
> > > > 
> > > > I need a conjunction of two terms, like this:
> > > > 
> > > >     X = (Str \= "" & Str \= ".")
> > > > 
> > > 
> > > What is X supposed to be, here? What is its type? Whats a
> > > possible
> > > value that it could have?
> > 
> > X should be a boolean value, "yes" or "no".
> 
>    X = ( if Str \= "", Str \= "." then yes else no )
> 
> will do that then. 

Yes, I understand now.

> When your goals are predicates you can pass around
> zero-arity curries of them:

What are "zero-arity curries"?

> 
>    :- module tobool.
>    :- interface.
>    :- import_module io.
>    :- pred main(io::di, io::uo) is det.
>    :- implementation.
>    :- import_module bool, list.
> 
>    main(!IO) :-
>        io.command_line_arguments(Args, !IO),
>        ( if Args = [Str] then
>            X = unify(Str, "") `andn` unify(Str, "."),

Why do you use unify/2, instead of "="?

>            io.print_line(X, !IO)
>        else
>            true
>        ).
> 
>    :- func (pred) `andn` (pred) = bool.
>    :- mode ((pred) is semidet) `andn` ((pred) is semidet) = out.
>    G1 `andn` G2 = B :-
>        ( if G1 ; G2 then
>            B = no
>        else
>            B = yes
>        ).
> 
> but it's likely that you don't really need bool values.

Yes, this I comprehend now. Like I've written: old habits from Haskell.


> As you didn't here.
> 
>   But I've messed up, it
> > shouldn't be done this way. I wanted to use it as the predicate in
> > a
> > "filter" call, like:
> > 
> > slice_path_1(PfadL) =
> >     filter( (func(Str::in) = Str \= [] && Str \= ['.']),
> >             split(PfadL)
> >           ).
> > 
> > Now I've figured it out:
> > 
> > slice_path_1(PfadL) =
> >     filter( (pred(Str::in) is semidet :-
> >                  Str \= [],
> >                  Str \= ['.']),
> >             split(PfadL)
> >           ).
> > 
> > Old habits from Haskell.
> > 
> > 
> > > If you want to fail if Str is either ""
> > > or ".", you can do that with any of
> > > 
> > >    Str \= "", Str \= "."
> > > 
> > >    not (Str = "" ; Str = ".")
> > > 
> > >    ( if Str = "" ; Str = "." then fail else true )
> > > 
> > > A,B and A&B only differ operationally: A and B might be executed
> > > in
> > > parallel in the second case.
> > > 
> > > > This doesn't work. I'm sure I don't understand what's going on.
> > > > Could
> > > > somebody please tell me how this is done?
> > > > 
> > > > Volker



More information about the users mailing list