Prolog-简单谓词-筛选对列表

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). 这是我在控制台

我有一个成对的列表(表示矩阵中的一些位置),我喜欢过滤列表以只包含原始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.

有什么问题吗?

有什么问题:变量以大写字母开头,您使用的否定形式不正确。这里有一个干净的方法:

首先,在一个单独的谓词中定义所需的精确条件:

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
。看见