摆脱prolog谓词中的重复

时间:2016-03-11 21:07:28

标签: prolog

我有一个多可用谓词,如果一个项目在多个位置可用,则返回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

1 个答案:

答案 0 :(得分:0)

我想出了另一种方法,我可以通过获取每件商品的所有地点并检查每件商品的列表至少2件事情。

helperm(X,L) :- bagof(A, available_at(X,A), L).
multi_available(X) :- helperm(X,[_,_|_]).