2012-03-25 130 views
1
scal(_, _, [], []). 
scal(Lista, [H|T], Wszystkie, [(X-Y)|Wynik]) :- 
    wez_poz(H, Lista, (X-Y)), 
    select(X, Wszystkie, W2), 
    select(Y, W2, W3), 
    scal(Lista, T, W3, Wynik). 

是否有人知道如何將謂詞重寫爲完全不同但工作原理相同? wez_poz(H, List, (X-Y))統一XYListaH位置,並且Wszystkie是在矩陣中所有位置的列表,例如wszystkie用於[[1, 2, 3], [2, 4, 5]][(1, 1), (1, 2), (1, 3), (2, 1), (2, 2), (2, 3)]重寫謂詞

+0

作業有點cos我寫了這個謂詞,但我想如果有什麼辦法讓它更快或更簡單 – whd 2012-03-25 16:51:43

回答

1

用於搜索和從提取元件對選擇/ 3 Wszystkie,從而可以在一個單一的謂詞被組合,用少許增益(I推測):

scal(_, _, [], []). 
scal(Lista, [H|T], Wszystkie, [(X-Y)|Wynik]) :- 
    wez_poz(H, Lista, (X-Y)), 
    find_pair(Wszystkie, X, Y, W3), 
    scal(Lista, T, W3, Wynik). 

find_pair([X|Wszystkie], X, Y, W3) :- 
    !, select(Y, Wszystkie, W3). 
find_pair([Y|Wszystkie], X, Y, W3) :- 
    !, select(X, Wszystkie, W3). 
find_pair([H|Wszystkie], X, Y, [H|W3]) :- 
    find_pair(Wszystkie, X, Y, W3). 

更好的優化可以利用一個分類數據結構爲Wszystkie。例如SWI-Prolog提供ordered setsred black trees。使用rb_tree搜索時間將減少到O(log(N)),但您必須考慮排序和更多的內存開銷。