我有一对配对列表(代表矩阵中的某些位置),我喜欢过滤列表以仅包含原始i的位置。 这就是我写的:
getRaw(_,[],[]).
getRaw(i,[(i,j)|LocationsTail],[(i,j)|result]) :-
getRaw(i,LocationsTail,result).
getRaw(i,[(k,t)|LocationsTail],result) :-
i\=k,
getRaw(i,LocationsTail,result).
这是我在控制台上写的:
1 ?- getRaw(1,[(1,2)],R).
false.
它有什么不对吗?
答案 0 :(得分:1)
出了什么问题:变量以大写字母开头,你使用了错误的否定版本。这是一个干净的方法:
首先,在单独的谓词中定义您所追求的精确条件:
fst_pair(X,(X,_)).
然后,尝试定义一个更通用的谓词,将其真值作为单独的参数:
fst_pair_truth(X,(X,_),true).
fst_pair_truth(X,(Y,_),false) :-
dif(X,Y).
请注意,否定的情况不仅仅是对正面情况的否定:两者都期望成对。
现在,你的定义是,也许重新考虑这个名字......
getRaw(I, Xs, Ys) :-
tfilter(fst_pair_truth(I), Xs, Ys).
有关tfilter/3
的定义,请参阅this answer。
答案 1 :(得分:0)
问题是变量的小写。 这是固定代码:
getRaw(_,[],[]).
getRaw(Raw,[(Raw,Col)|LocationsTail],[(Raw,Col)|Result]) :-
getRaw(Raw,LocationsTail,Result).
getRaw(Raw,[(K,_)|LocationsTail],Result) :-
Raw\=K,
getRaw(Raw,LocationsTail,Result).