2014-02-26 31 views
0

我有3個,4個規則是這樣的:我如何偏離回溯?

pagaTot(X,Acc,PagaMens):- giorno(d(X,_,14),[iniziato(I,_,_),_,ListServ|L]),!, 
          length(ListaServ,N),N<2, 
          member(finito(F),L), 
          I>=6, F=<24, 
          I1 is round(I)+round((I-round(I))*100)/60, 
          F1 is round(F)+round((F-round(F))*100)/60, 
          OreTot is F1-I1, 
          OreTot =<8, 
          Paga is (F1-I1)*6, 
          Acc1 is Paga+Acc,X1 is X+1, 
          pagaTot(X1,Acc1,PagaMens). 



pagaTot(X,Acc,PagaMens):- giorno(d(X,_,14),[iniziato(I,_,_),_,ListServ|L]),!, 
         length(ListaServ,N),N<2, 
         member(finito(F),L), 
         I>=6, F=<24, 
         I1 is round(I)+round((I-round(I))*100)/60, 
         F1 is round(F)+round((F-round(F))*100)/60, 
         OreTot is F1-I1, 
         OreTot >8, 
         OreDa7 is OreTot-8, 
         OreDa6 is OreTot-OreDa7, 
         Paga is OreDa6*6+OreDa7*7, 
         Acc1 is Paga+Acc,X1 is X+1, 
         pagaTot(X1,Acc1,PagaMens). 

當系統發現,這是它回溯一個錯誤的選擇。我不希望它再次檢查第一個子目標中的其他選擇 - 'giorno(d(...'),它更好地通向下一個'pagaTot(X ...')規則,這將更有效率每條規則大約需要3,4次調用,我試圖在第一個子目標_,ListServ | L),!,的末尾加上'!',但是這個限制不會讓它進入下一個規則。總不能 我沒有別的想法應該在哪裏這個切口放在是否有解決方案

+0

giorno是一個從我計算各種東西的長結構函子。並且在列表4或5的選擇點中計算應該通過另一個pagaTot: - 當選擇的人不能做到的時候的規則。 – vincent

回答

0

我會因式分解的共同部分,然後用的if/then/else語句區分變化點:?

pagaTot(X,Acc,PagaMens):- giorno(d(X,_,14),[iniziato(I,_,_),_,ListServ|L]), 
         length(ListaServ,N),N<2, 
         member(finito(F),L), 
         I>=6, F=<24, 
         I1 is round(I)+round((I-round(I))*100)/60, 
         F1 is round(F)+round((F-round(F))*100)/60, 
         OreTot is F1-I1, 
         ( OreTot =<8 
         -> Paga is (F1-I1)*6 
         ; OreDa7 is OreTot-8, 
          OreDa6 is OreTot-OreDa7, 
          Paga is OreDa6*6+OreDa7*7 
         ), 
         Acc1 is Paga+Acc,X1 is X+1 
         pagaTot(X1,Acc1,PagaMens). 

希望我沒有對cut'n'paste做任何錯誤...

+0

在工作人員的工作過程中,我多次想到如果,那麼,其他人。這太糟糕了,我從來沒有使用這些運營商。我將不得不學習一些來理解你的建議。不管怎麼說,還是要謝謝你! – vincent