在Prolog中使用DCG搜索List中的元素

时间:2016-01-10 02:45:12

标签: prolog swi-prolog dcg

我有一个清单

[-r,-R,-f,-i,-p]

我的测试用例是使用DCG检查列表中是否存在该元素

atom_codes('-R',X), phrase(cp_list(Y),X). 
Y='-R' or the ASCII Code

我在Prolog

中实现了这一点
% Use after stripping the '-' symbol from an atom
sub_element([],[]).
sub_element(X,[S|Y]):-
    X = [H|T],
    sub_atom(H, 1, 1, _, S),
    member(S,[r,f,i,p,'R']),
    sub_element(T,Y).

我将如何使用DCG实现此目的。

1 个答案:

答案 0 :(得分:1)

交互式控制台测试:

{
  "query": {
    "multi_match": {
      "type": "cross_fields",
      "query": "bart developer",
      "operator": "or",
      "fields": [
        "fullname",
        "tagging.tag.name"
      ],
      "fuzziness": 0
    }
  }
}

虽然可重复使用的代码可能是:

?- phrase(("-",("r"|"R"|"f"|"i"|"p")), `-R`).
true 

此类代码使用SWI-Prolog v.7进行测试,请注意带有反引号的代码列表。

OT:我对你的sub_element / 2的评论感到困惑:?- [user]. flag --> "-", [C], {memberchk(C, `rRfip`)}. ?- phrase(flag, `-R`). true. 似乎要求你不要剥去破折号...