我有一个多可用谓词,如果一个项目在多个位置可用,则返回true,否则返回false。它工作正常,但是当我传入X时,它会返回重复的所有可能性。我如何摆脱这些重复,因为在一种情况下给出了真假,但在另一种情况下给出了所有的值。以下是我的代码和事实,taqueria有一个名称,员工列表和项目列表:
taqueria(el_cuervo, [ana,juan,maria],
[carnitas_taco, combo_plate, al_pastor_taco, carne_asada_burrito]).
taqueria(la_posta,
[victor,maria,carla], [birria_taco, adobado_burrito, carnitas_sopa, combo_plate, adobado_plate]).
taqueria(robertos, [hector,carlos,miguel],
[adobado_plate, guacamole_taco, al_pastor_burrito, carnitas_taco, carne_asada_burrito]).
taqueria(la_milpas_quatros, [jiminez, martin, antonio, miguel],
[lengua_sopa, adobado_plate, combo_plate]).
isin(X,[X|_]).
isin(X,[_|T]) :- isin(X,T).
available_at(X,Y) :- taqueria(Y,K,Z), isin(X,Z).
multi_available(X) :- available_at(X,Y),available_at(X,Z),not(Y==Z).
?- multi_available(carnitas_taco).
true
?- multi_available(lengua_sopa).
false
?- multi_available(X).
X = carnitas_taco ;
X = combo_plate ;
X = combo_plate ;
X = carne_asada_burrito ;
X = combo_plate ;
X = combo_plate ;
X = adobado_plate ;
X = adobado_plate ;
X = adobado_plate ;
X = adobado_plate ;
X = carnitas_taco ;
X = carne_asada_burrito ;
X = adobado_plate ;
X = adobado_plate ;
X = combo_plate ;
X = combo_plate ;
No
答案 0 :(得分:0)
我想出了另一种方法,我可以通过获取每件商品的所有地点并检查每件商品的列表至少2件事情。
helperm(X,L) :- bagof(A, available_at(X,A), L).
multi_available(X) :- helperm(X,[_,_|_]).