Search code examples
prologswi-prolog

How to collect all the results


I have the following program:

ingrediente(X):-
        member(X,
                [
                    "almendra"
                    , "arroz"
                    , "atun"
                ]
            )
        .


tortitas(X):-
        ingrediente(Y)
        ,atom_concat("Tortitas de ", Y,X)
        .

ensalada(X):-
        ingrediente(Y)
        ,atom_concat("Ensalada de ", Y,X)
        .

ensalada(X):-
        ingrediente(Y)
        ,ingrediente(Z)
        , Y \= Z
        ,atom_concat(" Con ", Z, ConZ)
        ,atom_concat(Y, ConZ, YConz)
        ,atom_concat("Ensalada de ", YConz,X)
        ,!
        .

sopa(X):-
        ingrediente(Y)
        ,atom_concat("Sopa de ", Y,X)
        .

platillo(X):-
        sopa(X).

platillo(X):-
        ensalada(X).

platillo(X):-
        tortitas(X).

write_menu:-
    open('output.txt',write,Out)
    , maplist(platillo, Platillos)
    , forall(member(Platillo,Platillos), write(Out,Platillo))
    , close(Out)
    . 

It creates the file for me, but does not write the results. How can I correct the code?


Solution

  • If you trace the code, you'll find that Platillos is the empty list, so the forall does nothing. You can see this by doing the query:

    ?- maplist(platillo, Platillos).
    Platillos = [] ;
    Platillos = ['Sopa de almendra'] ;
    Platillos = ['Sopa de almendra', 'Sopa de almendra'] ;
    Platillos = ['Sopa de almendra', 'Sopa de almendra', 'Sopa de almendra'] ;
    Platillos = ['Sopa de almendra', 'Sopa de almendra', 'Sopa de almendra', 'Sopa de almendra'] ;
    Platillos = ['Sopa de almendra', 'Sopa de almendra', 'Sopa de almendra', 'Sopa de almendra', 'Sopa de almendra'] ;
    Platillos = ['Sopa de almendra', 'Sopa de almendra', 'Sopa de almendra', 'Sopa de almendra', 'Sopa de almendra', 'Sopa de almendra'] 
    

    Instead of maplist, try bagof (or setof):

    ?- bagof(X, platillo(X), Xs).
    Xs = ['Sopa de almendra', 'Sopa de arroz', 'Sopa de atun', 'Ensalada de almendra', 'Ensalada de arroz', 'Ensalada de atun', 'Ensalada de almendra Con arroz', 'Tortitas de almendra', 'Tortitas de arroz'|...].