Prolog:使用列表

Mat*_*tta 0 list prolog

我用 Prolog 列表完成了这项任务,我需要一些帮助。

在 Prolog 中构建一个程序

  1. 检查列表是否为空
  2. 检查列表是否不为空
  3. 检查列表是否只有一个元素
  4. 检查列表是否有 2 个或更多元素
  5. 从列表中获取第一个元素
  6. 从列表中获取第二个元素
  7. 获取没有第一个元素(尾部)的列表
  8. 将元素添加到列表的头部

sws*_*phe 5

听起来你是序言的最开始。这些问题主要与 prolog 如何统一变量和表达式有关。

  1. 检查列表是否为空

    empty([]).
    
    Run Code Online (Sandbox Code Playgroud)

    在序言中,您陈述事实和谓词。在这里,您只是说明任何空列表都为真。暗示所有其他表达式都是错误的。

  2. 检查列表是否不为空

    not_empty([_|_]).
    
    Run Code Online (Sandbox Code Playgroud)

    (由潜伏者改进)。此规则匹配至少有一个头部和零个或多个尾部元素的列表,因此空列表将失败。

  3. 检查列表是否只有一个元素

    one([_]).
    
    Run Code Online (Sandbox Code Playgroud)

    当 prolog 检查这一事实时,它只能绑定到一个包含一个元素的列表。所以它绑定的事实已经证明它是一个单元素列表。

  4. 检查列表是否有 2 个或更多元素

    two([_,_|_]).
    
    Run Code Online (Sandbox Code Playgroud)

    前 2 个下划线绑定到列表中的 2 个元素,第三个下划线绑定零个或多个尾随元素。所以这只会在具有两个或更多元素的列表上评估为真。

  5. 从列表中获取第一个元素

    first([H|_], H).
    
    Run Code Online (Sandbox Code Playgroud)

    Prolog 将绑定H到第一个参数和第二个参数中列表的第一个元素。你用 来调用它first([1,2,3],F).。Prolog 将绑定F到列表的第一个元素。你也可以调用它first([1,2,3],1).来询问是否1是第一个元素。

  6. 从列表中获取第二个元素

    second([_,I|_], I).
    
    Run Code Online (Sandbox Code Playgroud)

    仅使用简单绑定,第一个下划线与第一个元素、I第二个元素绑定,第二个下划线与列表的其余部分(如果有)绑定。如果您开始要求更高的元素,那么使用内置谓词nth1来为您完成工作会更容易。

  7. 获取没有第一个元素(尾部)的列表

    tail([_|T],T).
    
    Run Code Online (Sandbox Code Playgroud)

    Prolog 将尾部绑定到T,它必须与第二个匹配T才能被认为是真的。

  8. 将元素添加到列表的头部

    addelem(H,T,[H|T]).
    
    Run Code Online (Sandbox Code Playgroud)

    仅使用 Prolog 绑定,H将绑定到第三个参数中列表的前面,并绑定到列表T的尾部。与

    • addelem(1,[2,3,4],T).— 绑定T[1,2,3,4]
    • addelem(1,[2,3,4],[1,2,3,4]). ——证明这个结果是正确的。
    • addelem(H, [2,3,4], [1,2,3,4]). — 如果第二个参数与尾部匹配,则拉出第三个参数的第一个元素。
    • addelem(1, T, [1,2,3,4]).- 获得尾部的另一种方法,如果头部是1

  • 也许对非空有更好的定义:`not_empty([_|_]).` *即*,它有一个或多个元素。 (3认同)
  • @潜伏者。不是“也许”,而是 ** 肯定!** 考虑查询`?- not_empty(List)。` 我们*应该*得到哪些答案,根据上述定义我们实际上得到哪些答案? (2认同)