2014-03-28 98 views
1

我有謂詞如下快速PROLOG查詢

dur(a,1). 
dur(b,2). 
dur(c,3). 
dur(d,4). 

說我要加入列表的元素[A,B,C]所以總和= 6 如何訪問與關聯的值變量?

因爲這樣的事情

len([],0). 
len([H|T], Sum) :- 
    len(T, Rest), 
    Sum is H + Rest. 

不起作用,它工作正常[1,2,3],但不是爲[A,B,C]這是有道理的,但我不沒有線索如何使它爲列表len([a,b,c],Sum)工作。

+0

如果你有原子'了',你可以得到它的價值通過查詢'dur(a,Value)'。如果你有一個變量X,你可以通過查詢'dur(X,Value)'來得到任何'X'的值。你可以在你的'len'謂詞中使用它來對這些值進行求和,而不是嘗試對原子本身求和。 – lurker

回答

1

如何訪問與變量相關的值?

深的循環,在實際計算髮生

len([],0). 
len([H|T], Sum) :- 
    dur(H, V), % 'hardcoded' join 
    Sum is V + Rest. 
    len(T, Rest), 

必須「加入」現在真正的問題是顯而易見的。

由於一個連接在Prolog中是這樣一個基本操作 - 實際上,它幾乎沒有什麼特別之處 - 它難以編寫 - 因此重複使用 - 真正獨立於數據命名的算法。

通常「二階」編程可以幫助按摩數據以適應更通用的上下文。像

len(Keys, Len) :- maplist(dur, Keys, Nums), sum_list(Nums, Len). 

SWI-Prolog的自動加載MAPLIST/3來自庫(apply),其他一些Prolog的可能要求你明確加載...

+0

@mbratch:謝謝! – CapelliC