List 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

假设您在prolog中将食谱另存为

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。我将在运行代码后更新我的答案;)如果此答案满足您的问题,请不要忘记接受(并向上投票)。向上投票按钮下应为灰色复选标记。单击它^^我想你必须为此打开一个新问题。添加最少的知识库和您迄今为止的尝试。编辑不得破坏问题,也不得使现有答案无效。