【问题标题】:How to filter in Prolog with SWISH如何使用 SWISH 在 Prolog 中进行过滤
【发布时间】:2018-06-17 00:03:01
【问题描述】:

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

例如:

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

必须导致

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

我该怎么做?,我目前在SWISH工作

【问题讨论】:

  • 到目前为止你有什么尝试?

标签: list prolog filtering


【解决方案1】:
:- use_module(library(reif)).   % @987654321@|@987654322@
:- use_module(library(lambda)). % @987654323@|@987654324@

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

【讨论】:

  • 这是一个比我更好的答案,但是你不能通过说 ` :- use_module(library(reif)) 直接在 Swish 中使用这些库。 `
  • 你可以在 SWISH 中使用library(reif)(不是很明显)。
【解决方案2】:

您可以使用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

【讨论】:

  • CT_2 中的“CT”代表什么? (和“_2”,就此而言。)
  • 它是从我链接的错误答案中复制而来的。我相信它代表关闭/继续,并且它需要两个参数。
  • 谢谢。我以为 C 代表“可调用”,但是 T 是什么?...与“真相”有关吗?..
  • 是的,我认为这是为了真理。
  • @WillNess:继续,标准。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-05-25
  • 2020-03-22
  • 2018-07-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多