如何收集所有结果
How to collect all the results
我有以下程序:
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)
.
它为我创建文件,但不写入结果。我怎样才能更正代码?
如果跟踪代码,您会发现 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']
而不是 maplist
,尝试 bagof
(或 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'|...].
我有以下程序:
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)
.
它为我创建文件,但不写入结果。我怎样才能更正代码?
如果跟踪代码,您会发现 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']
而不是 maplist
,尝试 bagof
(或 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'|...].