Prolog 序言-将单词拆分为单独的字母

Prolog 序言-将单词拆分为单独的字母,prolog,Prolog,。如果不使用列表或内置谓词atom\u chars/2. 类似于拆分单词(单词、字母、其他)的东西。 其中字母是单词的第一个字母 我在拆分字符串时遇到困难,我不知道如何使用'作为“拆分器”。为了获得灵感,我试着用predicate属性(atom_char(u,u),P)检查atom_chars/2的源代码。我在那里找到了源代码,但在文件中我没有发现任何有用的东西 非常感谢您的帮助。据我所知,您不想使用atom\u chars/2,但可以使用其他内置谓词。您可以在SWI Prolog中使用sub_

。如果不使用列表或内置谓词
atom\u chars/2.

类似于拆分单词(单词、字母、其他)的东西。

其中字母是单词的第一个字母

我在拆分字符串时遇到困难,我不知道如何使用
'
作为“拆分器”。为了获得灵感,我试着用predicate属性(atom_char(u,u),P)检查
atom_chars/2
的源代码。我在那里找到了源代码,但在文件中我没有发现任何有用的东西


非常感谢您的帮助。

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

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
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].

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

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
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].
“将字符串拆分为原子”我想你的意思更具体地说是“将字符串拆分为字符列表”

首先,我们需要区分字符串和*原子。在Prolog中,用双引号表示的字符串通常是字符代码列表,而用单引号表示的原子或以小写字母开头的名称是符号。看见以下是GNU序言中的内容:

| ?- 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执行此操作,则首先需要使用
atom\u chars/2
将atom转换为字符代码:

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

H = a
T = [b,c]

yes
| ?-
在SWI Prolog中,他们允许使用双引号表示整数字符串,而不表示字符代码列表。然而,它与原子不同。看见以下是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
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”
与atom
abc
不同(从失败的统一中可以看出),但是
atom\u chars/2
“abc”
视为与atom一样,
abc

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

回到手头的问题,atom处理谓词对于Prolog来说是非常基本的,因此如果你需要在闭卷考试中进行atom处理,最好记住基本谓词。

通过“将字符串拆分为原子”,我假设你的意思更具体地说是“将字符串拆分为字符列表”

首先,我们需要区分字符串和*原子。在Prolog中,用双引号表示的字符串通常是字符代码列表,而用单引号表示的原子或以小写字母开头的名称是符号。看见以下是GNU序言中的内容:

| ?- 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执行此操作,则首先需要使用
atom\u chars/2
将atom转换为字符代码:

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

H = a
T = [b,c]

yes
| ?-
在SWI Prolog中,他们允许使用双引号表示整数字符串,而不表示字符代码列表。然而,它与原子不同。看见以下是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
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”
与atom
abc
不同(从失败的统一中可以看出),但是
atom\u chars/2
“abc”
视为与atom一样,
abc

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


回到手头的问题,atom处理谓词对于Prolog来说是相当基本的,所以如果你需要在闭卷考试中进行atom处理,最好把基本谓词背下来。

我做了一个有点尴尬的短语。我想知道的是将弦分裂成原子的机制。所以基本上,如果列表使用了[Head | Tail]之类的东西,但是对于字符串,我用了一种笨拙的短语。我想知道的是将弦分裂成原子的机制。所以基本上,如果列表使用[Head | Tail]之类的东西,但是对于字符串,你让它变得比实际更复杂。这个问题的答案几乎是根据您链接的问题的答案来完成的
atom_chars/2
给出一个atom或字符串与字符列表之间的对应关系。这时你需要做的就是:
split_-word(单词、字母、Rest):-atom_-chars(单词、[Letter | Rest])。
我知道如何用atom_-chars/2解决这个问题。问题是我将有一个关于prolog的闭卷考试,如果没有谷歌搜索,我永远不会知道这个内置谓词。我希望它能有所帮助!我把我的评论整理成了一个答案,并删除了我原来的评论。你让事情变得更复杂了。这个问题的答案几乎是根据您链接的问题的答案来完成的
atom_chars/2
给出一个atom或字符串与字符列表之间的对应关系。这时你需要做的就是:
split_-word(单词、字母、Rest):-atom_-chars(单词、[Letter | Rest])。
我知道如何用atom_-chars/2解决这个问题。问题是我将有一个关于prolog的闭卷考试,如果没有谷歌搜索,我永远不会知道这个内置谓词。我希望它能有所帮助!我把我的评论整理成一个答案,并进行了讨论