Prolog - 简单谓词 - 过滤对的列表

时间:2014-04-20 15:11:14

标签: 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).

这是我在控制台上写的:

1 ?- getRaw(1,[(1,2)],R).

false.

它有什么不对吗?

2 个答案:

答案 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).