我的数据库由以下谓词组成:
路(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 ).
答案 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).
如果您首先对所有点进行排序,那么您可以只遍历此排序列表一次,以测试每个点是否出现在偶数道路中。