Recursion 简单递归Prolog函数

Recursion 简单递归Prolog函数,recursion,prolog,Recursion,Prolog,我目前正在尝试创建一个简单的函数,在给定第一个和最后一个数字的列表中打印整数 例如,函数调用:count(3,7,Z)将打印“Z=[3,4,5,6,7]” 以下是我迄今为止的尝试: count(First,Last,Result):- First <= Last, append(First,Result,Result), count(First+1,Last,Result). 计数(第一个、最后一个、结果):- 第一个逐行: 计数(第一个、最后一个、结果):- 糟糕的风格:这

我目前正在尝试创建一个简单的函数,在给定第一个和最后一个数字的列表中打印整数

例如,函数调用:count(3,7,Z)将打印“Z=[3,4,5,6,7]”

以下是我迄今为止的尝试:

count(First,Last,Result):-
  First <= Last,
  append(First,Result,Result),
  count(First+1,Last,Result).
计数(第一个、最后一个、结果):-
第一个逐行:

  • 计数(第一个、最后一个、结果):-

    糟糕的风格:这个名字暗示了另一个功能


  • 首先您的程序有很多问题。首先,当您编写
    3+2
    Prolog时,它不会像任何其他语言那样计算结果。您必须明确要求执行计算,并通过谓词
    is
    将计算结果绑定到变量,例如,
    X是3+2,
    ,然后将
    X
    绑定到
    5
    ,以用于规则尾部的其余部分

    其次,写入
    append(First,Result,Result)
    意味着“通过将
    First
    追加到
    Result
    中,您将再次获得
    Result
    ”,除非
    First
    是空列表,否则该操作将始终失败(读取:product
    false
    ),因为如果您将某个内容追加到列表中,您获得的列表比开始时的列表更长。显然,您未能区分
    追加
    计数
    中的两个
    结果
    ——它们实际上并不相同。另外请注意,
    append(A,B,C)
    适用于列表,因此
    A
    B
    C
    都必须是可以实例化为列表的列表或术语,否则将失败。这正是您的情况,因为
    First
    始终是一个数字-肯定不是列表,而是它的成员。因此,您不应使用
    append
    :使用列表构造和与
    =
    的统一来将元素追加到列表中,并将获得的结果绑定到变量,例如
    X=[element | list]

    最后,如果上述所有内容都正确,您的谓词仍然会失败,因为您没有定义归纳的基本情况。换句话说:谓词何时应该回答
    []
    ?如前所述,
    First>Last
    :在这种情况下,范围为空,并且
    Result
    也必须为空。在您的程序中,当发生这种情况时,谓词显然会失败(请注意,当您写入
    foo(X,Y):-X>=0时,Y是X+1。
    ,这意味着每当
    X
    小于零时就会失败)。作为递归的基本情况的空范围,谓词的计算迟早会在这里结束,因此它总是会失败

    最后,你应该写下如下内容:

    ints(First, Last, Interval) :- First > Last -> Interval = [] ;
      NFirst is First + 1, ints(NFirst, Last, NInterval), Interval = [First | NInterval].
    
    (我为谓词和变量提供了更多的声明性名称)。当然,这个谓词只有在第一个和最后一个完全实例化为数字时才起作用(不能反转)