在我的Prolog程序中,我有一个谓词reg/1,它表示如果某事是一个正则表达式。我想让程序将正则表达式序列识别为正则表达式。因此,如果reg(a_1)、reg(a_2)、.、reg(a_n)都是正则表达式,则Prolog应该对查询reg(a_1, a_2, ..., a_n)回答yes/true。但我不知道该怎么做。
我所做的是:
reg([H|T]) :- reg(H), reg(T).
reg([X]) :- reg(X).例如,如果reg(a)、reg(b)、reg(c)都在知识库中,那么Prolog回答是/真的查询reg([a, b])或reg([b, a, c]),但我不能问它类似于reg(a, b)或reg(b, a, c),也就是说,我不能去掉方括号。
发布于 2014-11-16 09:58:58
在Prolog中,使用相同的不同性质的结构是非常罕见的。要向您展示一个可以使用但没有使用它们的地方,请考虑指令,因为它们用于声明谓词动态、多文件或不连续。比方说,我想声明a/2和b/5动态。下列选项在ISO-Prolog中是可能的:
:- dynamic(a/2).
:- dynamic(b/5).
:- dynamic([a/2,b/5]). % using a list
:- dynamic((a/2,b/5)). % using an and-sequence此外,许多Prolog系统都将dynamic/1声明为前缀操作符(作为实现特定的扩展),因此您可以编写:
:- dynamic a/2.
:- dynamic b/5.
:- dynamic [a/2,b/5].
:- dynamic a/2, b/5.然而,没有
:- dynamic(a/2,b/5). % does not work这符合你的想法。
如果您真的想要使用该表示形式,则需要使用(=..)/2。我想说这是许多潜在错误的来源。
想到的唯一一种情况是,通常使用“可变”性的结构是一组变量的紧凑表示,因为它们在setof/3的实现中使用。不是使用变量列表Vs,而是使用结构V。
term_varvect(T, V) :-
term_variables(T, Vs),
V =.. ['.'|Vs]. % some use v instead of '.'在具有有限max_arity的系统中,必须处理溢出情况:
term_varvect(T, V) :-
term_variables(T, Vs),
catch( V =.. ['.'|Vs],
error(representation_error(max_arity), _),
Vs = V).https://stackoverflow.com/questions/26955610
复制相似问题