我有一个任意输入的符号序列,例如progressive,必须确定它是否包含输入的符号序列,例如progress。我的想法是把字符串分解成字母列表和比较列表。
'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.发布于 2014-05-13 19:05:48
不需要在引号中添加谓词名(除非使用空格或其他非字母字符,但通常不应该这样做)。
最好是使用ISO标准的atom_codes而不是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])):
?- contain(progressive, progress).
true
?- contain(progressive, progrev).
false.发布于 2014-05-13 20:20:49
我认为一个更好的解决方案是使用atom/5:它得到了国际标准化组织的认可,并为文本分析提供了更多的功能。一个使用的例子
9 ?- sub_atom('swi-prolog', _,_,_, o).
true ;
true ;
false.
10 ?- sub_atom('swi-prolog', N,_,_, o).
N = 6 ;
N = 8 ;
false.https://stackoverflow.com/questions/23639219
复制相似问题