Prolog-简单谓词-筛选对列表
我有一个成对的列表(表示矩阵中的一些位置),我喜欢过滤列表以只包含原始I的位置。 这是我写的:Prolog-简单谓词-筛选对列表,prolog,Prolog,我有一个成对的列表(表示矩阵中的一些位置),我喜欢过滤列表以只包含原始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). 这是我在控制台
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.
有什么问题吗?有什么问题:变量以大写字母开头,您使用的否定形式不正确。这里有一个干净的方法: 首先,在一个单独的谓词中定义所需的精确条件:
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).
有关
t过滤器/3
的定义,请参阅,问题在于变量的小写形式。
以下是固定代码:
getRaw(_,[],[]).
getRaw(Raw,[(Raw,Col)|LocationsTail],[(Raw,Col)|Result]) :-
getRaw(Raw,LocationsTail,Result).
getRaw(Raw,[(K,_)|LocationsTail],Result) :-
Raw\=K,
getRaw(Raw,LocationsTail,Result).
prolog中的变量必须以大写字母
?-getRaw(R,[(2,3)],[])开头。
失败,但有R
的值使其成功,如R=1
。您需要使用dif/2
代替(\=)/2
。看见