没有固定的算子(Prolog)

时间:2014-11-16 09:41:17

标签: prolog

在我的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)之类的东西,也就是说,我无法摆脱方括号。

1 个答案:

答案 0 :(得分:3)

在Prolog中使用具有不同arities的相同结构是非常罕见的。为了向您展示一个可以使用但未使用的地方,请考虑使用指令,因为它们用于声明谓词动态,多文件或不连续。说,我想声明a/2b/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).