Prolog-该程序如何工作
|
我有用序言语言编写的程序。
问题是我无法理解它是如何工作的。
even_number([],[]).
even_number([H|T],S):-even_number(T,W),Z is H mod 2,Z==0,S=[H|W].
even_number([_|T],S):-even_number(T,S).
它所做的就是从列表中提取偶数并将其存储到另一个列表中。
我知道它可以使用递归工作,但是我无法理解执行过程中的步骤。
谁能解释?
没有找到相关结果
已邀请:
2 个回复
导力疵谜
。 第一条规则是:空列表中的偶数是空列表。这很容易。 如果第一个规则失败(即第一个参数不是空列表),则应用第二个规则。这有点复杂,但是基本上说要包括列表的第一个元素(如果是偶数的话)。逻辑分解如下。如果右边的所有条件都为真,则以
开头且尾部为
的列表中的偶数为ѭ4::
中的偶数为某个列表
。
是
除以2后的余数;
为零;
是
,然后是
(无论
是什么)。 (请注意,如果将第一个项移至测试ѭ14after之后,则此规则将更有效。) 如果该规则失败(即
是奇数),则应用最后一条规则:列表中的偶数是列表尾部的偶数。
磁辫覆氓
第一个谓词ѭ17谓词是公共包装器。它调用私有助手“ѭ18”,该助手以相反的顺序返回偶数列表。它颠倒了这一点,并尝试将其与包装器中传递的结果统一起来。 helper方法执行以下操作: 如果源列表为空:将累加器(T)与结果统一。 如果源列表不为空,并且列表的首(X)为偶数, 向下递归到列表的尾部(Xs),将X推到累加器上。 如果源列表不为空,并且列表的首部(X)为奇数, 向下递归到列表的尾部(Xs),而无需修改累加器。 但是,正如@AndréParamés指出的那样,在调试器中对其进行处理,将清楚正在发生的事情。