【发布时间】:2015-11-28 23:07:55
【问题描述】:
我在 PROLOG 中有代码:
vals(_,[],_).
vals([H|T],[(H,C)|L],K) :- vals([H|T],L,(K,C)).
此代码接收列表和元组列表,例如:
vals([1],[(1,4),(1,2)],X).
我检查第一个列表中的元素是否等于另一个列表中的某些元组第一个元素。在这种情况下,foundValues 将返回 true,因为 1 等于每个元组的第一个元素。这很好用,但不是返回真/假,而是在结果列表中我想返回每个元组的所有第二个元素,其中它的第一个元素等于列表中的元素。在这种情况下,X 应该是 [4,2]。我正在尝试使用(K,C)来做到这一点,但没有成功。 所以,问题是 - 如何返回列表?
【问题讨论】:
-
现在,
vals/3的第三个参数实际上并没有做任何事情。你可以让它成为你想要的列表。如果[H|T]的头部与[(H,C)|L]头部的第一个元素匹配,你认为第三个参数的头部应该是什么?你认为第三个论点的尾巴应该来自哪里(或者应该如何确定)? -
第三个参数的头部应该是C,但是我不知道如何在每次调用后递归地将元素添加到列表中。
-
结果看起来像
[C|R]。您只需要告诉它如何从输入的尾部获取结果的尾部 (R)。这比您想象的要容易。 -
为什么你的第一个参数是一个列表,而你只使用头部?当您的示例中并非第二个列表中的所有元组都以 1 开头时,您不应该添加一个案例吗?
-
这是一个基本情况,列表也可以更长,包含更多元素。当不是第二个列表中的所有元组都以 1 开头时: vals([H|T],[(O,_)|L],K)) :- H\=O,foundValues2([H|T], L,K)