2012-07-19 40 views
3

當我在GNU Prolog和SWI Prolog上運行它時,此代碼正確計算差異列表中的元素數。但是,Yap進入了一個無限循環。Prolog差異列表:代碼適用於SWI和GNU Prolog,但不是Yap

count(X-X1,0) :- unify_with_occurs_check(X,X1), !. 
count([H|T]-T1,N) :- count(T-T1,M), N is M+1. 

?- count([1,2|A]-A,N). 

爲什麼Prolog解釋器(如Yap)在詢問此查詢時未終止?

+1

我想你的代碼邑6.2.2和它的工作精細。 ' - - count([1,2 | A] -A,N)。 N = 2' – gusbro 2012-07-19 19:53:48

+1

@gusbro在yap 5.11:trace:'? - count([1,2 | A] -A,N)中循環。 (1)call:count([1,2 | _1059] -_ 1059,_1063)? (1)redo:count([1,2,1,2,1,2,1,2,1,2,...] -_ 1059,_1063)? (2)call:count([2,1,2,1,2,1,2,1,2,1,...] -_ 1059,_1147)? (2)redo:count([2,1,2,1,2,1,2,1,2,1,...] -_ 1059,_1147)?' – 2012-07-19 20:49:03

+0

嗯,我正在使用5.1.3 ,所以它可能是一個固定的bug ... – Jay 2012-07-19 23:41:35

回答

3

似乎有邑錯誤5.1.3

新版本(與邑6.2.2測試)工作的優良:

?- count([1,2|A]-A,N). 
    N = 2