2016-03-12 5 views
2

мне нужно сделать предикат, который проверяет, является ли общая стоимость ингредиентов, чтобы сделать X равного Y. Вот мои факты:Пролог странно Ошибка при рекурсивном переборе списка

cost(carne_asada,3). 
cost(lengua,2). 
cost(birria,2). 
cost(carnitas,2). 
cost(adobado,2). 
cost(al_pastor,2). 
cost(guacamole,1). 
cost(rice,1). 
cost(beans,1). 
cost(salsa,1). 
cost(cheese,1). 
cost(sour_cream,1). 
cost(taco,1). 
cost(tortilla,1). 
cost(sopa,1). 


ingredients(carnitas_taco, [taco,carnitas, salsa, guacamole]). 
ingredients(birria_taco, [taco,birria, salsa, guacamole]). 
ingredients(al_pastor_taco, [taco,al_pastor, salsa, guacamole, cheese]). 
ingredients(guacamole_taco, [taco,guacamole, salsa,sour_cream]). 
ingredients(al_pastor_burrito, [tortilla,al_pastor, salsa]). 
ingredients(carne_asada_burrito, [tortilla,carne_asada, guacamole, rice, beans]). 
ingredients(adobado_burrito, [tortilla,adobado, guacamole, rice, beans]). 
ingredients(carnitas_sopa, [sopa,carnitas, guacamole, salsa,sour_cream]). 
ingredients(lengua_sopa, [sopa,lengua,beans,sour_cream]). 
ingredients(combo_plate, [al_pastor, carne_asada,rice, tortilla, beans, salsa, guacamole, cheese]). 
ingredients(adobado_plate, [adobado, guacamole, rice, tortilla, beans, cheese]). 

Вот мой код:

helpt([],0). 
helpt([H|T],V):-helpt(T,VT),cost(H,Y),V is VT+Y. 
total_cost(X,K) :- ingredients(X,Y),helpt(Y,B),K==B. 

Это работает правильно, когда я делаю эти 2 вещи:

?- total_cost(carnitas_taco,3). 
false 

?- total_cost(X,5). 
X = carnitas_taco ; 
X = birria_taco ; 
X = lengua_sopa ; 
false 

но когда я делаю это:

?- total_cost(carnitas_taco,X). 

не печатает не даже хотя это должно быть 5.

там что-то не так с моим синтаксисом?

ответ

1

Проблема заключается в том IMHO

total_cost(X,K) :- ingredients(X,Y),helpt(Y,B),K==B. 

если вы измените его на

total_cost(X,B) :- ingredients(X,Y),helpt(Y,B). 

я получить правильный результат.

==/2 проверяет на равенство, в то время как вы хотите иметь унификацию.

+0

Почему бы не работать с равенством, я понимаю, почему вы работаете, но почему не сравнивает два аргумента с helpt и total_cost work –

+1

, потому что 'X == 2' оценивает значение false, потому что' X' является переменной, а '2' является атомом , 'X = 2', однако, объединит' X' с двумя и будет работать. – CAFEBABE

Смежные вопросы