如何判断原子是否包含Prolog中的子原子

时间:2015-11-13 03:39:39

标签: 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_split(argv,'!=',Commands),

将原子拆分为基本部分,最好是以队列顺序进行解析。此外,并非所有部件都必然是输入原子的一部分,这增加了其复杂性。理想情况下,最后,我将与分裂原子的各个部分叠加,例如

func('A+B==C').
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),

Commands = [A,+,B,==,C].

然后,我将使用这些命令来判断某些内容是否符合语法:

?- func(‘E+d;’). 
true. 
?-func(‘if:a and b’). 
false. 

1 个答案:

答案 0 :(得分:3)

答案很简单:使用This is the link to screenshot。它应该在每个Prolog实现中都可用。

但你的方法非常值得怀疑。你确定你的表达式必须是原子吗?从Prolog顶级(解释器),您可以免费获得解析您在问题中显示的大多数表达式。例如:

?- Expr = (a + b == c), write_canonical(Expr).
==(+(a,b),c)
Expr =  (a+b==c).

在此示例中,=+==中的每一个都已定义为Prolog运算符,因此a + b == c之类的内容实际上是有效的Prolog术语。 你当然可以sub_atom/5

另一种选择是编写一个合适的&#34;解析器&#34;对于表达式,这在Prolog中并不太难。您可以将表达式设为define your own operators。那么,你似乎追求的是一个标记化器,可能最容易在更方便的list of chars or a list of codes中实现。我认为应该可以找到执行此操作的代码示例,而您目前的问题并未提供足够的信息来尝试显示实际代码以进行标记化或解析。