我需要创建一个名为fAtomPairs的谓词,以便给出一个原子(第一个参数)和一个对的列表(每对依次是一个由两个原子组成的列表),将第三个参数与过滤后的对列表统一,只选择第一个原子作为它们的第一个分量的对,这是第一个参数。
例如:
fAtomPairs(sA,[[basA,absAb],[ab,bbsA],[sA,abbsB],[bsA,sAsB],[sA,bb]],X) 必然会导致
X = [[sA,abbsB],[sA,bb]]我怎么能这么做?,我现在在斯威什工作
发布于 2018-06-15 20:10:33
:- use_module(library(reif)). % SICStus|SWI
:- use_module(library(lambda)). % SICStus|SWI
fAtomPairs(Sel, DEs, Es) :-
tfilter(\[A,_]^ ( Sel = A ), DEs, Es).发布于 2018-06-14 07:04:20
您可以使用tfilter/3和/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
falsehttps://stackoverflow.com/questions/50850079
复制相似问题