【问题标题】:How can I check whether an user imputed string matches a string in a list?如何检查用户估算的字符串是否与列表中的字符串匹配?
【发布时间】:2016-11-04 21:41:59
【问题描述】:

我想检查用户输入的句子中的单词是否与列表中的至少一个字符串匹配。这就是我所拥有的。当我输入例如“香蕉车”(它不应该)时,我的谓词测试返回 false。

在嗖嗖的序言中,我编写了 enterQuery。当出现提示时,我写了“香蕉车”。我回来了[香蕉,汽车][香蕉,苹果]假

enterQuery:-
read(X),
processQuery(X).

processQuery(X):-
split_string(X," ", " ", L),
write(L),
test(L).

test(L):-
write([banana, apple]),
common_member(L,[banana,apple]),
write('successs').

common_member(Xs,Ys) :-
member(E,Xs),
member(E,Ys).

当我查询时:

?- enterQuery.
|: 'banana car'.
[banana,car][banana,apple]
false.

相反,我希望:

?- enterQuery.
|: 'banana car'.
[banana,car][banana,apple]successs

【问题讨论】:

  • 对我来说看起来不错。你需要展示你的实际交互,仅仅说“返回false”是不够的。
  • @Boris 好的。在解释器(swish prolog)中,我写:enterQuery。当提示时,我输入“香蕉车”。我得到的输出是 [banana, car][banana, apple]false 谢谢!
  • 不,不够好,您真的应该将实际的交互式提示内容复制粘贴到问题中。

标签: prolog swi-prolog


【解决方案1】:

您在显示的代码中做了很多不必要的事情。

这是我直接从顶层执行此操作的方法:

?- L = [banana, car], member(E, L), member(E, [banana, apple]).
L = [banana, car],
E = banana .

目前的问题是您的代码需要string,但您给了它一个原子。使用您的代码:

?- enterQuery.
|: "banana car".
[banana,car][banana,apple]
false.

注意双引号!

还有一个问题:现在,第一个列表中的bananacarstring,第二个列表中的bananaapple 是原子。

或者,演示:

?- read(X), string(X).
|: banana.

false.

?- read(X), string(X).
|: "banana".

X = "banana".

因此,您还需要将要比较的列表从 [banana, apple]["banana", "apple"]

它仍然是非常混乱的代码,不清楚为什么要使用 read/1 阅读,而不是像在此答案顶部的第一个代码 sn-p 中那样输入它。

编辑:

如果你需要从顶层输入一个句子,没有什么能阻止你用单引号(对于一个原子)、双引号(对于一个字符串)将它包裹起来,并且仍然将它作为 a 的参数输入谓词

下面是一些示例代码:

string_words(S, Ws) :-
        separators_string(Seps),
        split_string(S, Seps, Seps, Ws).

separators_string(Seps) :-
        findall(C,
                ( char_type(C, white)
                ; char_type(C, punct)
                ),
                Cs),
        string_chars(Cs, Seps).

加载后:

?- string_words("banana car", Ws).
Ws = ["banana", "car"].

?- string_words("Hello, how are you doing?", Ws).
Ws = ["Hello", "how", "are", "you", "doing"].

【讨论】:

  • 谢谢@Boris。用 ["banana", "apple"] 替换 [banana, apple] 就可以了。
  • 我使用 write 是因为我想模拟用户输入任何句子的情况,其中每个单词都应与标准单词列表匹配。
  • @JCR 我想说的是,顶层为您提供完全免费的术语阅读和写作:几乎总是不需要在顶部添加自己的半生不熟的交互式提示顶级,嗯,交互式提示一个REPL。
【解决方案2】:

当面对(大量)文本解析时,您可以在 SWI-prolog 中尝试内置的 tokenize_atom/2。尽管名称如此,它实际上可以与其他文本表示一起使用:

?- tokenize_atom('apple banana', L).
L = [apple, banana].

?- tokenize_atom("apple banana", L).
L = [apple, banana].

?- tokenize_atom(`apple banana`, L).
L = [apple, banana].

鲍里斯已经谈到了其他人的细节......

【讨论】:

  • 感谢您的建议!
  • 这是一个非常好的谓词,以前没见过,所以谢谢你展示它!
  • ?- tokenize_atom('Agent 007 do 0815',L). 回答L = ['Agent', 7, do, 815].
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2022-12-12
  • 2010-12-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-07-27
相关资源
最近更新 更多