Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/ssis/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
返回true后出现Prolog错误?_Prolog - Fatal编程技术网

返回true后出现Prolog错误?

返回true后出现Prolog错误?,prolog,Prolog,我对使用Prolog还不熟悉,所以可能我遗漏了一些明显的东西。我正在制定一个Tribonaci规则。与Fib相同,但Trib[N]=Trib[N-1]+Trib[N-2]+Trib[N-3],其中0、1、2分别为0、0、1 到目前为止,我得到的是: trib(0,0). trib(1,0). trib(2,1). trib(N,T) :- A is N-1, B is N-2, C is N-3, trib(A,AT), trib(B,BT),

我对使用Prolog还不熟悉,所以可能我遗漏了一些明显的东西。我正在制定一个Tribonaci规则。与Fib相同,但
Trib[N]=Trib[N-1]+Trib[N-2]+Trib[N-3]
,其中0、1、2分别为0、0、1

到目前为止,我得到的是:

trib(0,0).  
trib(1,0).  
trib(2,1).  
trib(N,T) :- A is N-1,   
    B is N-2, C is N-3,  
    trib(A,AT), trib(B,BT),  
    trib(C,CT), T is AT+BT+CT.    
我得到了对
trib(10,X)
和其他情况的正确输出,但当它返回时,我得到:

?- trib(4,X).  
X = 2   
Unknown action:  (h for help)  
Action?    
我相信它是在返回X后发现错误的


它似乎在等待commant停止(进入),或寻找更多(空间)


打印答案后如何使其停止?

我通过将(0,1,2)定义为
trib(0,0):-!,找到了问题的答案

@Enigmativity几乎是对的。你应该使用
在所有谓词中,结尾处。那么prolog将无法尝试其他解决方案。例如:

trib(0,0) :- !.  
trib(1,0) :- !.  
trib(2,1) :- !.  
trib(N,T) :- A is N-1,   
    B is N-2, C is N-3,  
    trib(A,AT), trib(B,BT),  
    trib(C,CT), T is AT+BT+CT, !.
其他两种解决方案:

  • 将另一个谓词与
  • 将另一个谓词与one连用
  • 因此,在您的用例中:

    trib(0,0).  
    trib(1,0).  
    trib(2,1).  
    trib(N,T) :- A is N-1,   
        B is N-2, C is N-3,  
        trib(A,AT), trib(B,BT),  
        trib(C,CT), T is AT+BT+CT,
    tribonacci1(N,T) :- trib(N,T),!.
    tribonacci2(N,T) :- once(trib(N,T)).
    
    如果调用它们,它们(tribbonacci1和tribonacci2)将执行一次

    场外:


    如果您想让它更高效,请尝试使用带有3个累加器的辅助函数。

    它似乎在等待commant停止(输入),或寻找更多(空间)。如何在打印答案后使其停止?请尝试将
    N>2
    放在最后一个谓词中,以防止它变为负数,并尝试重新计算基本情况。N>2有助于避免在我继续(空格)时耗尽堆栈。但现在它返回false。我如何在找到一个答案后让它停止?我不需要它返回到选择点。您的查询应该会成功。Prolog仅在配置为继续时才继续。您的程序没有。当您在常规大小写谓词中有
    N>2
    时,这不会有什么区别。