【问题标题】:How to collect all the results如何收集所有结果
【发布时间】:2021-06-26 01:06:49
【问题描述】:

我有以下程序:

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)
    . 

它为我创建文件,但不写入结果。如何更正代码?

【问题讨论】:

    标签: prolog swi-prolog


    【解决方案1】:

    如果你跟踪代码,你会发现Platillos 是一个空列表,所以forall 什么都不做。你可以通过查询看到这一点:

    ?- 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'] 
    

    试试bagof(或setof),而不是maplist

    ?- 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'|...].
    
    

    【讨论】:

    • 对于打印,您可以使用从bagof 获得的列表中的maplist。或者你可以做forall(platillo(X), writeln(X)):bagof(X, platillo(X), Xs), maplist(writeln, Xs).
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-01-31
    • 1970-01-01
    • 1970-01-01
    • 2017-11-05
    • 1970-01-01
    • 2013-12-31
    • 2012-06-03
    相关资源
    最近更新 更多