从数据库计数

时间:2012-10-19 13:00:45

标签: prolog

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

路(1,2,吉尔)。 路(2,3,blauw)。 路(1,3,吉尔)。

前两个数字是积分。我必须检查每个点是否有偶数道路。我设法使用以下代码完成它,但不知何故,我认为有更好的方法。

% 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 ).

1 个答案:

答案 0 :(得分: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).

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