在我的Prolog程序中,我有一个谓词reg/1
,它表示某些东西是正则表达式。我想让程序将正则表达式的序列识别为正则表达式。因此,如果reg(a_1)
,reg(a_2)
,...,reg(a_n)
都是正则表达式,则Prolog应对查询reg(a_1, a_2, ..., a_n)
回答是/ true。
但我不知道该怎么做。
我所做的是以下内容:
reg([H|T]) :- reg(H), reg(T).
reg([X]) :- reg(X).
例如,如果reg(a)
,reg(b)
,reg(c)
都在知识库中,那么Prolog会对查询reg([a, b])
或{{1'回答是/ true但我不能问reg([b, a, c])
或reg(a, b)
之类的东西,也就是说,我无法摆脱方括号。
答案 0 :(得分:3)
在Prolog中使用具有不同arities的相同结构是非常罕见的。为了向您展示一个可以使用但未使用的地方,请考虑使用指令,因为它们用于声明谓词动态,多文件或不连续。说,我想声明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
。我说这是许多潜在错误的来源。
唯一可以想到的结构是"变量" arity通常用于变量集的紧凑表示,因为它们用于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).