2017-03-23 17 views
1

我有車的列表(在德國汽車),其中第一個變量是車牌,第二個速度:序言 - 平均謂:參數不夠實例

[auto(eu-ts884, 69), auto(dn-gh184, 64), auto(ac-lj123, 72)]. 

現在我試着寫的平均謂詞,但它失敗,出現錯誤消息:

ERROR: Arguments are not sufficiently instantiated

到目前爲止我的代碼:

durchschnitt([], 0, 0). 
durchschnitt([auto(_, X)|Tail], L, Y):- 
         Y is S/L, 
         L > 0, 
         cardinal([auto(_, X)|Tail], L), 
         sumKilometer([auto(_, X)|Tail], S). 


sumKilometer([], 0). 
sumKilometer([auto(_, X)|Tail], Sum) :- 
      sumKilometer(Tail, N), 
      Sum is N + X. 


cardinal([], 0). 
cardinal([_|Tail], Result) :- 
    cardinal(Tail, N), 
    Result is N + 1. 

我的代碼與post相當,儘管我無法弄清楚我的錯誤。

注意sumKilometercardinal工作正常。

+0

' - L = [1,2,3,4,5],聚合((count,sum(N)),member(N,L),(Count,SumN)),Ave是SumN/Count。 L = [1,2,3,4,5], Count = 5, SumN = 15, Ave = 3 ' – CapelliC

回答

2

你寫:

durchschnitt([], 0, 0). 
durchschnitt([auto(_, X)|Tail], L, Y):- 
    Y is S/L, 
    L > 0, 
    cardinal([auto(_, X)|Tail], L), 
    sumKilometer([auto(_, X)|Tail], S). 

的第一個問題是,當你調用durchschnitt([auto(foo,2)],L,Y)L是自由變量。因此,您無法計算Y is S/L,因爲SL在此處未知。

但是,您可以使用:

durchschnitt([], 0, 0). 
durchschnitt([auto(_, X)|Tail], L, Y):- 
    cardinal([auto(_, X)|Tail], L), 
    sumKilometer([auto(_, X)|Tail], S), 
    Y is S/L.

所以在這裏你既LS已知後計算平均值。此外,你不[auto(_,X)|Tail]統一列表等像A = [_|_]一個簡單的檢查就足夠了:

durchschnitt([], 0, 0). 
durchschnitt(A, L, Y):- 
    A = [_|_], 
    cardinal(A, L), 
    sumKilometer(A, S), 
    Y is S/L.

這也將減少花費在包裝拆包量。

總和,隊長和平均同時所有

您可以構造計算三個都在同一時間謂詞(所以沒有在列表循環兩次)。可以簡單地使用累加器,如:

durchschnitt(A,L,Y) :- 
    durchschnitt(A,0,0,L,Y).

這裏所述第二和第三元件是分別運行總和和長度。

現在對於durchschnitt/5,有兩種情況。在第一種情況下,我們已經達到了列表的末尾,因此,我們必須計算平均值和返回它,如:

durchschnitt([],S,L,L,Y) :- 
    (L \= 0 
    -> Y is S/L 
    ; Y = 0). 

所以我們使用if-then-else的檢查,如果長度是東西不同於0(在列表中沒有auto s的情況下,我們將0作爲平均值返回。

在遞歸的情況下,我們簡單的增量運行長度和更新運行總和,如:

durchschnitt([auto(_,Si)|T],RS,RL,L,Y) :- 
    RSN is RS+Si, 
    L1 is L+1, 
    durchschnitt(T,RSN,L1,L,Y). 

或者將其組合在一起:?

durchschnitt(A,L,Y) :- 
    durchschnitt(A,0,0,L,Y). 

durchschnitt([],S,L,L,Y) :- 
    (L \= 0 
    -> Y is S/L 
    ; Y = 0). 
durchschnitt([auto(_,Si)|T],RS,RL,L,Y) :- 
    RSN is RS+Si, 
    L1 is L+1, 
    durchschnitt(T,RSN,L1,L,Y).