如何使用Prolog检查特定strA是否为strB的子字符串?

如何使用Prolog检查特定strA是否为strB的子字符串?,prolog,Prolog,所以基本上我用这个代码来检查子字符串: substring(X,S) :- append(_,T,S), append(X,_,T), X \= []. 我的意见是: substring("cmp", Ins) % Ins is "cmp(eax, 4)" 但当我使用swi prolog跟踪此代码时,我发现: substring([99, 109, 112], cmp(eax, 4)) 显然它失败了 那么有谁能给我一些帮助吗?SWI Prolog将传统的字符串文字作为“代码列表”来表示

所以基本上我用这个代码来检查子字符串:

substring(X,S) :- append(_,T,S), append(X,_,T), X \= [].
我的意见是:

substring("cmp", Ins)   % Ins is "cmp(eax, 4)"
但当我使用swi prolog跟踪此代码时,我发现:

substring([99, 109, 112], cmp(eax, 4))
显然它失败了

那么有谁能给我一些帮助吗?

SWI Prolog将传统的字符串文字作为“代码列表”来表示更高效的内存(从版本7开始)

因此(在其他更难解释的问题中),append/3不再适用于您的任务,除非您显式地转换为代码列表

在上下文中,引入了许多内置项,例如/5:try

?- sub_string("cmp(eax, 4)", Start,Len,Stop, "eax").
Start = Stop, Stop = 4,
Len = 3

将此字符串设置为
cmp(eax,4)
形式的术语。在这里,用Prolog术语来说,您有:

  • 术语
    cmp(eax,4)
  • 使用函子
    cmp/2
  • 第一个参数是atom
    eax
  • 第二个参数是整数4
现在您有了一个术语,您可以在谓词的头部使用模式匹配(统一)来编写谓词,如:

apply_instruction(cmp(Reg, Operand) /*, other arguments as needed */) :-
    /* do the comparison of the contents of _Reg_ and the values in _Operand_ */
apply_instruction(add(Reg, Addend) /*, other arguments */) :-
    /* add _Addend_ to _Reg_ */
% and so on
如何从输入中提取术语:有很多种方法,最简单的方法是阅读一整行(取决于您在SWI Prolog中使用的Prolog实现,假设您在中有输入流):

然后使用DCG对其进行解析。DCG可能看起来像:

instruction(cmp(Op1, Op2)) -->
    "cmp",
    ops(Op1, Op2).

instruction(add(Op1, Op2) -->
    "add",
    ops(Op1, Op2).

ops(Op1, Op2) -->
    space,
    op1(Op1), optional_space,
    ",", optional_space,
    op2(Op2),
    space_to_eol.

% and so on
然后,您可以使用
短语/2
将DCG应用于您已阅读的行:

phrase(instruction(Instr), Line).

你的代码对我有用。请尝试使用
子字符串(“cmp”、“cmp(eax,4)”)。
问题在于如何将Ins实例化为“cmp(eax,4)”。请立即停止并更改数据表示形式。将汇编指令表示为字符串并使用substring/2分析它们是非常不明智的。从问题中的跟踪来看,“cmp”变成了[99109112],因此这是主题初学者系统上的代码列表。我知道,这个问题有点模糊。。。也许在回答之前我应该询问版本等。。。
phrase(instruction(Instr), Line).