我做了一個謂詞,它以2個列表作爲參數,並返回一個與「recipesub」產品連接的列表,但是我需要制定第三個規則來禁止如果手頭的產品是空白列表,則插入產品。序言:選擇不在列表遞歸期間插入元素
所以第一個列表看起來是這樣的:
recipe([ingredient(rice,4),ingredient(salt,3),ingredient(water,5)]).
,第二個是這樣的:
ingredients([ingredient(rice,3),ingredient(salt,4),ingredient(water,4),
在它返回的那一刻:List = [ingredient(rice,1),[],ingredient(water,1)]
我希望它返回:List = [ingredient(rice,1),ingredient(water,1)]
need_to_buy([],_,List):- List = [].
need_to_buy([H|Hs],[X|Xs],[Difference|List]):-
H = ingredient(Type,Amount),
recipesub(Type,Amount,[X|Xs],Difference),
need_to_buy(Hs,[X|Xs],List).
以下是我用這個解決方案得到了多少。
/*need_to_buy([H|Hs],[X|Xs],List):-
H = ingredient(Type,Amount),
recipesub(Type,Amount,[X|Xs],Difference),
Difference = [],
need_to_buy(Hs,[X|Xs],List).*/
這是支持斷言recipesub。
recipesub(Type,Amount,[],Difference):-
Difference = ingredient(Type,Amount).
recipesub(Type,Amount,[Z|_],Difference):-
Z = ingredient(Type,Stock),
Amount>Stock,
NewAmount is Amount-Stock,
Difference = ingredient(Type,NewAmount).
recipesub(Type,Amount,[Z|_],Difference):-
Z = ingredient(Type, Stock),
Stock >= Amount,
Difference = [].
recipesub(Type,Amount,[Z|Zs],Difference):-
Z = ingredient(WrongType,_),
WrongType \= Type,
recipesub(Type,Amount,Zs,Difference).
[MCVE](http://stackoverflow.com/help/mcve),請。這個'recipesub/4'是什麼? – false 2014-11-04 13:59:55
Recipesub是一個謂詞,它將第一個列表的頭部與第二個列表中的每個元素進行遞歸比較,如果「H」中的變量「Amount」小於X中的「Amount」,則返回差值=成分(type,requiredAmount),但如果X中的變量Amount大於H中的變量Amount,則返回一個空列表。 – pinkyring 2014-11-04 14:12:08
好的,對不起,我現在已經盡了我的能力。 – pinkyring 2014-11-04 14:22:50