【发布时间】:2016-11-01 13:20:48
【问题描述】:
我是 prolog 的新手,我在做一些作业时遇到了麻烦。 在我的代码的某些部分,我必须在回溯时生成给定集合的子集。意思是,代码应该尝试一个子集,当它失败下一个条件时,尝试下一个子集。我做了一些研究,默认函数subset 不会回溯,因为正如this 问题中所述,两个参数都是input arguments。所以我建立了一个自定义的,它仍然没有回溯。你能告诉我我失败的地方吗?这是我的代码:
营养素(8)。 产品(牛奶,[2,4,6])。 产品(猪排,[1,8])。 产品(酸奶,[3,1])。 产品(亲爱的,[5,7])。 产品(塑料,[3,5,2])。 产品(魔术,[5,7,8])。nutrientlist(N,L):-findall(I,between(1,N,I),L).
subset2([],[]):-!.
subset2([X|T],[X|T2]):-
subset2(T,T2).
subset2([_|T],[T2]):-
subset2(T,T2).
shopping(K,L):-
numNutrients(J),
nutrientlist(J,N),
findall(P,product(P,_),Z),
subset2(X,Z),
length(X,T),
T =< K,
covers(X,N),
L = X.
covers(_,[]):-!.
covers([X|L],N):-
product(X,M),
subset2(M,N),
subtract(N,M,T),
covers(L,T).
main:-
shopping(5,L),
write(L).
问题在于谓词购物(K,L)。当它到达谓词subset2时,它给出了长度为6(不是5)的整个集合,然后失败并且不回溯。由于所有先前的谓词都无法回溯,因此它会失败。
那么,为什么subset2 不回溯?
感谢您的宝贵时间。
【问题讨论】: