返回true后Prolog错误?

时间:2018-03-24 00:55:30

标签: prolog

我是使用Prolog的新手,所以也许我错过了一些明显的东西。我正在制定一个Tribonacci规则。与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停止(输入),或者寻找更多(空格)。

打印答案后如何让它停止?

2 个答案:

答案 0 :(得分:0)

我通过将(0,1,2)定义为trib(0,0) :- !.

找到了问题的答案

答案 1 :(得分:-1)

@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, !.

其他两个解决方案:

  1. 使用!,
  2. 使用另一个谓词
  3. 一次使用另一个谓词。
  4. 所以在你的用例中:

    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)都会执行一次。

    <强> Offtop:

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