重写谓词

时间:2012-03-25 07:30:53

标签: prolog

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)) XY的{​​{1}}位置统一HLista是矩阵中所有位置的列表,例如wszystkie Wszystkie[[1, 2, 3], [2, 4, 5]]

1 个答案:

答案 0 :(得分:1)

这对select / 3用于搜索并从Wszystkie中提取元素,因此可以组合在一个谓词中,稍微增加一点(我推测):

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