2012-03-25 132 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)),但您必须考虑排序和更多的内存开销。