Split 在Prolog中如何判断一个原子是否包含一个子原子

Split 在Prolog中如何判断一个原子是否包含一个子原子,split,prolog,contains,Split,Prolog,Contains,我正在设计一个程序,它接受一个参数(一个原子)。然后将其拆分为程序定义的部分,例如 func(argv) :- atom_split(argv,'else:',Commands), atom_split(argv,'+',Commands), atom_split(argv,'==',Commands), atom_split(argv,'>',Commands), atom_split(argv,'<',Commands), atom

我正在设计一个程序,它接受一个参数(一个原子)。然后将其拆分为程序定义的部分,例如

func(argv) :-
    atom_split(argv,'else:',Commands),
    atom_split(argv,'+',Commands),
    atom_split(argv,'==',Commands),
    atom_split(argv,'>',Commands),
    atom_split(argv,'<',Commands),
    atom_split(argv,'!=',Commands),
简单的答案是:使用。它应该在每个Prolog实现中都可用

但你的方法很值得怀疑。你确定你的表情一定是原子吗?从Prolog顶层(解释器),您已经可以免费解析问题中显示的大多数表达式。例如:

?- Expr = (a + b == c), write_canonical(Expr).
==(+(a,b),c)
Expr =  (a+b==c).
在本例中,
=
+
=
中的每一个都已定义为Prolog运算符,因此类似于
a+b==c
的内容实际上是一个有效的Prolog术语。 你当然可以


另一种选择是为表达式编写适当的“解析器”,这在Prolog中并不太困难。你可以先把你的表情变成一个表情。那么,您想要的似乎是一个标记器,它可能最容易在更方便的环境中实现。我认为应该可以找到这样做的代码示例,而您目前的问题没有提供足够的信息来尝试显示用于标记化或解析的实际代码。

请注意,
atom_split/3
是特定于某些实现的,并且没有完全定义。ISO标准规定了:
sub_atom/5
atom_concat/2
。我明白你的意思,但是,我使用BNF来确定给定语法是否正确,因此,我需要能够将所有内容分解为我相信的基本形式。我需要能够说一些类似于
?-func('E+d;')的话。是的-func('if:a和b')。错误。
?- func(‘E+d;’). 
true. 
?-func(‘if:a and b’). 
false. 
?- Expr = (a + b == c), write_canonical(Expr).
==(+(a,b),c)
Expr =  (a+b==c).