Recursion 如何使这个谓词工作?extractedKnowledge(SourceList,ExtractedList)

Recursion 如何使这个谓词工作?extractedKnowledge(SourceList,ExtractedList),recursion,prolog,logic,gnu,Recursion,Prolog,Logic,Gnu,我有一个谓词,我似乎无法开始工作。 谓词应按以下方式使用:为谓词提供一个事物列表KnowledgeList和一个未实例化的变量ExtractedList。 然后谓词应继续填充ExtractedList。 要填充ExtractedList,它会遍历KnowledgeList中的项目, 构建提取内容的新列表,并将此列表附加到ExtractedList 我知道我可能应该使用递归来解决这个问题,但我现在感到很困惑 extractedKnowledge(KnowledgeList, ExtractedLi

我有一个谓词,我似乎无法开始工作。 谓词应按以下方式使用:为谓词提供一个事物列表KnowledgeList和一个未实例化的变量ExtractedList。 然后谓词应继续填充ExtractedList。 要填充ExtractedList,它会遍历KnowledgeList中的项目, 构建提取内容的新列表,并将此列表附加到ExtractedList

我知道我可能应该使用递归来解决这个问题,但我现在感到很困惑

extractedKnowledge(KnowledgeList, ExtractedList) :-
  list(KnowledgeList),
  ExtractedList = [],
  length(KnowledgeList,ListLength),
  for(X,1,ListLength),
  nth(X,KnowledgeList,ListElement),
  ...?
由于统一了ExtractedList,它将始终为空。您确实应该使用递归。下面是一个框架递归程序,让您开始:

% base case: we can only extract 0 items from 0 items
extracted_knowledge([],[]).
% recursive case
extracted_knowledge([Item|Knowledge], Extracted) :-
    extracted_knowledge(Knowledge, Extracted0),
    % build Extracted from Extracted0 by adding Item,
    % if it needs to be extracted

谢谢,你帮我开始了。