【问题标题】:Recursively create list in Prolog在 Prolog 中递归创建列表
【发布时间】: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)

标签: list prolog tuples


【解决方案1】:

这是一个关于如何附加到列表的示例,仅适用于 1 个元素。

三种情况:

  • 对于空列表
  • 当元素匹配元组的第一个条目时
  • 当元素不匹配时

从这里开始,您应该能够创建您的示例。

vals(_,[],[]).
vals(H,[(H,C)|L],[C|K]) :- vals(H,L,K).
vals(H,[(H2,_)|L],K) :- 
    H \= H2,
    vals(H,L,K).

例子:

vals(1,[(1,2),(1,3)],X).
X = [2, 3] ;
false.

额外:

【讨论】:

  • 如果第一个列表的元素数至少与第二个列表一样多,则此谓词始终返回[],如果第一个列表比第二个短,则返回失败。第一个参数H 在第二和第三子句中不正确。另外,为什么要考虑使用蓄电池?最后,为什么建议削减案例2?它应该使用dif(H, H2) 并且没有切割,它保持了谓词的关系能力。
  • 是不是只有空无一物才返回空列表?
  • 不。你试过了吗?例如,尝试vals([1,2], [(1,a), (3,b), (4,c)], L).。结果应该是L = [a]。 OP 的示例恰好只使用一个元素的列表。但描述清楚地表明,检查第一个列表中的元素是否等于某些元组...
  • 我想我想展示的内容存在误解。我更新了我的答案。我回答了“所以,问题是 - 如何返回列表?”。不放弃一切。
  • 我使用剪切的原因:结果仍然存在,而计算次数减少了。不确定“谓词的关系能力”是什么意思?
猜你喜欢
  • 2020-12-22
  • 2012-10-04
  • 1970-01-01
  • 2015-06-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多