Prolog - 将单词分成单独的字母

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Prolog - 将单词分成单独的字母相关的知识,希望对你有一定的参考价值。

Follow up to this question。如何在不使用列表或内置谓词atom_chars/2.的情况下将单词拆分为字母

沿着split_word(Word, Letter, Rest).的路线

信是这个词的第一个字母。

我有分裂弦的困难,我不知道如何利用''作为“分裂器”。为了获得灵感,我尝试用atom_chars/2检查predicate_property(atom_char(_,_), P).的源代码,在那里我得到了源代码,但是在文件中我找不到任何有用的东西。

帮助赞赏。

答案

通过“将一个字符串拆分为原子”我假设你更具体地意思是“将一个字符串拆分成一个字符列表”。

首先,我们需要区分字符串与*原子。在Prolog中,用双引号表示的字符串通常是字符代码列表,而用单引号表示的原子或以小写字母开头的名称是符号。见What is the difference between ' and " in Prolog。这是GNU Prolog中的样子:

| ?- X = "abc".  % A string of characters

X = [97,98,99]

yes
| ?- X = 'abc'.  % An atom

X = abc

yes
| ?- X = abc.    % An atom

X = abc

yes
| ?- X = 'Abc'.  % An atom

X = 'Abc'

yes
| ?-

因此,如果您想从字符串中获取字符代码列表的头部和其余部分,那么就像统一它们一样简单:

| ?- "abcd" = [H | T].

H = 97
T = [98,99,100]

yes
| ?-

另一方面,如果你想用原子做这个,那么首先你需要使用atom_chars/2将原子转换为字符代码:

| ?- atom_chars(abc, [H|T]).

H = a
T = [b,c]

yes
| ?-

在SWI Prolog中,他们允许使用双引号来表示整数字符串,而不表示字符代码列表。但它与原子不同。见Why has the representation of double quoted text changed?。以下是SWI Prolog中的一些查询:

1 ?- "abc" = 'abc'.
false.

2 ?- X = "abc".
X = "abc".

3 ?- "abc" = [H|T].
false.

4 ?- atom_chars("abc", [H|T]).
H = a,
T = [b, c].

5 ?- atom_chars(abc, [H|T]).
H = a,
T = [b, c].

奇怪的是,"abc"与原子abc不同(正如失败的统一所示),但atom_chars/2对待"abc"与原子abc相同。

Prolog有标志影响其行为。特别是在SWI Prolog中,有double_quotes标志,其值可以修改,以便双引号表示在传统的Prolog意义上表现,如上面的GNU Prolog示例所示。

回到手头的问题,原子处理谓词对于Prolog来说是相当基础的,所以如果你需要在闭卷考试中进行原子处理,那么最好先了解基本原理。

另一答案

据我所知,你不想使用atom_chars/2,但可以使用其他内置谓词。您可以使用sub_string/5string_length/2以这种方式在SWI Prolog中解决问题:

split(_,0).
split(S,Len):-
    Len > 0,
    Len1 is Len-1,
    sub_string(S,0,1,_,Sub), %get the first letter
    writeln(Sub),
    sub_string(S,1,Len1,_,Sub1), %get the rest of the string
    split(Sub1,Len1).

solve(S):-
    string_length(S,Len),
    split(S,Len).

?- solve("abcd").
a
b
c
b
true

以上是关于Prolog - 将单词分成单独的字母的主要内容,如果未能解决你的问题,请参考以下文章

将同一个单词中混合大小写分成两行

用单词和数字按字母顺序排列字符串

将驼峰式句子拆分成单词

片段(Java) | 机试题+算法思路+考点+代码解析 2023

Python - 将字符列表与单词列表进行比较?

统计单词个数