step('pancakes', 1, 'mix butter and sugar in a bowl', [butter, sugar], ['bowl']).
step('pancakes', 2, 'add eggs', [eggs], []).
step('pancakes', 3, 'mix flour and bakingpowder', [flour, baking_powder], []).
steps(R,Y,P):-
findall(A,step(R,_,A,_,P),Z),
distinctSteps(Z,Y).
distinctSteps(Z,Y) :-
list_to_set(Z,Y).
所以我有这个知识库和一个规则,它应该用我给出的作为参数的特定工具来检索步骤。例如,steps('pancakes', bowl, I).
应该返回I = ['mix butter and sugar in a bowl']
。然而,它只给了false
。如果我将它简化为R,Y
,它可以工作,但这不是我想要的。我做错了什么?
发布于 2020-11-20 20:29:57
所以这可能是一个误解。你的配料术语是原子(bowl
)还是列表([bowl]
)?我之所以问这个问题,是因为这是我想出来的知识库,但我不确定这是否符合您的要求。所以我假设你用的是餐具清单。请注意,以下知识库与您的知识库不同(因此问题也不同):
step(pancakes, 1, 'mix butter and sugar', [butter, sugar], [bowl, mixer]).
step(pancakes, 2, 'add eggs', [eggs], []).
step(pancakes, 3, 'mix flour and bakingpowder', [flour, bakingpowder], [bowl]).
hasUtensil(Dish, Step, Instr, Ingr, Utensil):-
step(Dish, Step, Instr, Ingr, U),
member(Utensil, U).
stepsUtensil(Dish,Utensil,Instructs):-
findall(A, hasUtensil(Dish,_,A,_,Utensil), Instructs).
?- stepsUtensil(pancakes, bowl, I).
I = ['mix butter and sugar', 'mix flour and bakingpowder']
stepsUtensil/5
不会简单地从step/5
的工具列表中删除所有工具。它只需要询问工具列表中的所有成员即可。例如,第一步:
?- hasUtensil(_,1,_,_,U).
U = bowl ;
U = mixer ;
false.
如果您要将hasUtensil/5
作为事实编写,它将如下所示:
step(pancakes, 1, 'mix butter and sugar', [butter, sugar], bowl).
step(pancakes, 1, 'mix butter and sugar', [butter, sugar], mixer).
step(pancakes, 3, 'mix flour and bakingpowder', [flour, bakingpowder], bowl).
https://stackoverflow.com/questions/64926530
复制相似问题