如何使用SWISH过滤Prolog

时间:2018-06-14 05:19:32

标签: list prolog filtering

我需要创建一个名为 fAtomPairs 的谓词,以便给定一个原子(第一个参数)和一对对列表(每个对依次是两个原子的列表),统一第三个参数使用过滤对的列表,只选择那些第一个成分作为第一个参数的原子对。

例如:

fAtomPairs(sA,[[basA,absAb],[ab,bbsA],[sA,abbsB],[bsA,sAsB],[sA,bb]],X)  

必须导致

X = [[sA,abbsB],[sA,bb]]

我该怎么做?我目前正在SWISH

工作

2 个答案:

答案 0 :(得分:5)

:- use_module(library(reif)).   % SICStus|SWI
:- use_module(library(lambda)). % SICStus|SWI

fAtomPairs(Sel, DEs, Es) :-
   tfilter(\[A,_]^ ( Sel = A ), DEs, Es).

答案 1 :(得分:4)

您可以使用tfilter/3if_/3的版本。 我还将表示从两个元素的列表更改为对。

fAtomPairs(sA,[basA-absAb,ab-bbsA,sA-abbsB,bsA-sAsB,sA-bb]).


tfilter(_CT_2,    [], []).
tfilter(CT_2, [E-Thing|Es], Fs0) :-
   if_(call(CT_2,E), Fs0 = [E-Thing|Fs], Fs0 = Fs ),
   tfilter(CT_2, Es, Fs).

=(X,X,true).
=(X,Y,false) :- dif(X,Y).


if_(If_1, Then_0, Else_0) :-
   call(If_1, T),
   (  T == true -> call(Then_0)
   ;  T == false -> call(Else_0)
   ;  nonvar(T) -> throw(error(type_error(boolean,T),_))
   ;  /* var(T) */ throw(error(instantiation_error,_))
   ).

然后查询:

?-fAtomPairs(SA,Pairs),tfilter(=(SA),Pairs,Filtered).
Filtered = [sA-abbsB, sA-bb],
Pairs = [basA-absAb, ab-bbsA, sA-abbsB, bsA-sAsB, sA-bb],
SA = sA
false