List prolog中的配方函数
假设您在prolog中将食谱另存为List prolog中的配方函数,list,prolog,recipe,List,Prolog,Recipe,假设您在prolog中将食谱另存为 step(meal name, stepnumber, stepexaplanation, ingredients (list) , utensils). 因此,对于每一个餐名,您都有多个步骤,包括制作这顿饭的所有说明。然后,如何创建一个调用getStepText(X,Y,Z)的函数。?所以如果你问: ?- getStepText('pancakes',2,Y). 它将返回第二步的文本,用于制作煎饼 step('pancakes', 1, 'mix b
step(meal name, stepnumber, stepexaplanation, ingredients (list) , utensils).
因此,对于每一个餐名
,您都有多个步骤,包括制作这顿饭的所有说明。然后,如何创建一个调用getStepText(X,Y,Z)的函数。
?所以如果你问:
?- getStepText('pancakes',2,Y).
它将返回第二步的文本,用于制作煎饼
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], []).
getStepText(Dish,Num,Text):-
step(Dish, Num, Text, _, _).
?- getStepText('pancakes',2,Y).
Y = 'add eggs' ;
false.
如果您使用的是SWI Prolog,则可以使用内置谓词findall/3
查找所有步骤。别忘了把它们分类
getSteps(X,S):-
findall(N,step(X,N,_,_,_),Bag),
sort(Bag,S).
?- getSteps('pancakes',Y).
Y = [1, 2, 3] ;
false.
如果不想使用findall/3
,可以定义一个助手谓词getSteps/3
。该谓词假定所有步骤都是增量的,并从1开始
getSteps(X,S):-
getSteps(X,S,1).
getSteps(X, [], N):-
\+ step(X, N, _, _, _).
getSteps(X, [N|T], N):-
step(X, N, _, _, _),
NN is N+1,
getSteps(X, T, NN).
?- getSteps('pancakes',Y).
Y = [1, 2, 3] ;
false.
说明:您基本上从1开始运行计数器N
(调用时设置),直到找不到当前编号N
的任何步骤。第一条规则测试结束:如果您没有当前N
的步骤,“返回”空列表[]
否则,当您找到编号为
N
的步骤时,请尝试查找下一个值NN
(即N+1
)的步骤列表T
,一旦找到,请将N
放在列表顶部T谢谢。你将如何使用函数getSteps(X,S)。所以当你调用getSteps(“煎饼”S)时。它将返回S=[1,2,3,4]。例如,对于SWI prolog中的函数findall?,可以使用findall。我将在运行代码后更新我的答案;)如果此答案满足您的问题,请不要忘记接受(并向上投票)。向上投票按钮下应为灰色复选标记。单击它^^我想你必须为此打开一个新问题。添加最少的知识库和您迄今为止的尝试。编辑不得破坏问题,也不得使现有答案无效。