我需要创建一个名为 fAtomPairs 的谓词,以便给定一个原子(第一个参数)和一对对列表(每个对依次是两个原子的列表),统一第三个参数使用过滤对的列表,只选择那些第一个成分作为第一个参数的原子对。
例如:
fAtomPairs(sA,[[basA,absAb],[ab,bbsA],[sA,abbsB],[bsA,sAsB],[sA,bb]],X)
必须导致
X = [[sA,abbsB],[sA,bb]]
我该怎么做?我目前正在SWISH
工作答案 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/3和if_/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