首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何在Prolog中使用SWISH进行过滤

如何在Prolog中使用SWISH进行过滤
EN

Stack Overflow用户
提问于 2018-06-14 05:19:32
回答 2查看 197关注 0票数 0

我需要创建一个名为fAtomPairs的谓词,以便给出一个原子(第一个参数)和一个对的列表(每对依次是一个由两个原子组成的列表),将第三个参数与过滤后的对列表统一,只选择第一个原子作为它们的第一个分量的对,这是第一个参数。

例如:

代码语言:javascript
复制
fAtomPairs(sA,[[basA,absAb],[ab,bbsA],[sA,abbsB],[bsA,sAsB],[sA,bb]],X)  

必然会导致

代码语言:javascript
复制
X = [[sA,abbsB],[sA,bb]]

我怎么能这么做?,我现在在斯威什工作

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-06-15 20:10:33

代码语言:javascript
复制
:- use_module(library(reif)).   % SICStus|SWI
:- use_module(library(lambda)). % SICStus|SWI

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

Stack Overflow用户

发布于 2018-06-14 07:04:20

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

代码语言:javascript
复制
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,_))
   ).

然后查询:

代码语言:javascript
复制
?-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
票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50850079

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档