Prolog 在字符串中查找字符串

Prolog 在字符串中查找字符串,prolog,Prolog,我有一个任意输入的符号序列,例如progressive,必须确定它是否包含输入的符号序列,例如progressive。 我的想法是将字符串分解成字母列表并比较列表 'break'(Str,L):-'name'(Str,L1),'change'(L1,L). 'change'([],[]). 'change'([X|T],[S|T1]):-'name'(S,[X]),'change'(T,T1). 'break'(progressive,X). X = [p, r, o, g, r, e, s,

我有一个任意输入的符号序列,例如
progressive
,必须确定它是否包含输入的符号序列,例如
progressive
。 我的想法是将字符串分解成字母列表并比较列表

'break'(Str,L):-'name'(Str,L1),'change'(L1,L).
'change'([],[]).
'change'([X|T],[S|T1]):-'name'(S,[X]),'change'(T,T1).

'break'(progressive,X).
X = [p, r, o, g, r, e, s, s, i|...].
但我不知道如何打破这两个词和比较列表

'break'(Str,L):-'name'(Str,L1),'change'(L1,L).
'change'([],[]).
'change'([X|T],[S|T1]):-'name'(S,[X]),'change'(T,T1).

'break'(progressive,X).
X = [p, r, o, g, r, e, s, s, i|...].
工作程序示例:

contain([progressive, progress]).   - Yes.
contain([progressive, progrev]).    - No.

不需要将谓词名称放在引号中(除非使用空格或其他非字母字符,但通常不应该这样做)

最好使用ISO标准
atom\u代码
,而不是
name

下面是您想要的某种高级实现:

contain(X, Y) :-
    atom_codes(X, Xcodes),
    atom_codes(Y, Ycodes),
    append(_, End, Xcodes),
    append(Ycodes, _, End).
测试运行(我使用
contain(progressive,progress)。
而不是
contain([progressive,progress])。
在您的示例中给出,因为它对我更有意义。如果您需要完全符合示例,只需将谓词
contain(X,Y)
的开头更改为
contain([X,Y])


不需要将谓词名称放在引号中(除非使用空格或其他非字母字符,但通常不应该这样做)

最好使用ISO标准
atom\u代码
,而不是
name

下面是您想要的某种高级实现:

contain(X, Y) :-
    atom_codes(X, Xcodes),
    atom_codes(Y, Ycodes),
    append(_, End, Xcodes),
    append(Ycodes, _, End).
测试运行(我使用
contain(progressive,progress)。
而不是
contain([progressive,progress])。
在您的示例中给出,因为它对我更有意义。如果您需要完全符合示例,只需将谓词
contain(X,Y)
的开头更改为
contain([X,Y])


我认为更好的解决方案是使用/5:它是ISO批准的,为文本分析提供了更多的功能。用法示例

9 ?- sub_atom('swi-prolog', _,_,_, o).
true ;
true ;
false.

10 ?- sub_atom('swi-prolog', N,_,_, o).
N = 6 ;
N = 8 ;
false.

我认为更好的解决方案是使用/5:它是ISO批准的,为文本分析提供了更多的功能。用法示例

9 ?- sub_atom('swi-prolog', _,_,_, o).
true ;
true ;
false.

10 ?- sub_atom('swi-prolog', N,_,_, o).
N = 6 ;
N = 8 ;
false.

顺便说一句,如果你的函子名称以小写字母开头,没有空格,你不需要在所有函子名称周围加单引号。顺便说一句,如果你的函子名称以小写字母开头,没有空格,你不需要在所有函子名称周围加单引号。谢尔盖,对不起,我犯了一个错误。在我的实验室里,有一个关于slackware的prolog。。。我不能使用谓词atom_代码:(@user3633791您的序言是否有类似于
atom_代码的其他内容?
?您可以查看用于atom处理的文档吗?@潜伏者,可能没有,所以我设想了一个如下形式的分区:“break”(Str,L):-“name”(Str,L1),“change”(L1,L),“change”([],[])。“change”([X | t],[s | T1]:“name”(s,[X]),'change'(T,T1)。@user3633791只需将所有'atom_代码'更改为'name'。Sergey,非常感谢!Sergey,对不起,我犯了一个错误。在我的实验室中,有一个slackware的prolog…我不能使用谓词atom_代码:(@user3633791您的序言中是否还有类似于原子代码的其他内容?您能看一下原子处理的文档吗?@潜伏者,可能没有,所以我设想了一个如下形式的分区:'break'(Str,L):-'name'(Str,L1),'change'(L1,L)。'change'([],[]。'change'([X | T],[s | T1]):-'name'(s,[X]),'change'(T,T1)@user3633791将所有“原子代码”更改为“名称”。@Sergey,非常感谢!