2

我的数据库由以下谓词组成:

路(1,2,geel)。路(2,3,蓝)。路(1,3,geel)。

其中前 2 个数字是点。我必须检查每个点是否有偶数条道路。我设法用下面的代码做到了,但不知何故,我认为有更好的方法来做到这一点。

% Count(Element, List, Occurences) => Counts the amount of occurences of Element in the    given List
count(_, [], 0).
count(X, [X | T], N) :-
  !, count(X, T, N1),
  N is N1 + 1.
count(X, [_ | T], N) :-
  count(X, T, N).

checkRoad :-
    findall(Point,(weg(Point,_,_) ; weg(_,Point,_)),List),
    list_to_set(List,K),
    foreach( (member(P,K), count(P, List,N)), N mod 2 =:= 0 ).
4

1 回答 1

0

我认为这种方法会有更好的性能:

checkRoad:-
  findall(Point,(road(Point,_,_) ; road(_,Point,_)),List), % renamed wge/3 with road/3
  msort(List, SList),
  checkEven(none, SList).

checkEven(_, []).
checkEven(Item, [Item|SList]):-
  !,
  checkOdd(Item, SList).
checkEven(_, [Item|SList]):-
  checkOdd(Item, SList).

checkOdd(Item, [Item|SList]):-
  checkEven(Item, SList).

如果您首先对所有点进行排序,那么您只需遍历此排序列表一次即可测试每个点是否出现在偶数条道路中。

于 2012-10-19T13:18:30.243 回答