首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >函子不固定(Prolog)

函子不固定(Prolog)
EN

Stack Overflow用户
提问于 2014-11-16 09:41:17
回答 1查看 178关注 0票数 1

在我的Prolog程序中,我有一个谓词reg/1,它表示如果某事是一个正则表达式。我想让程序将正则表达式序列识别为正则表达式。因此,如果reg(a_1)reg(a_2)、.、reg(a_n)都是正则表达式,则Prolog应该对查询reg(a_1, a_2, ..., a_n)回答yes/true。但我不知道该怎么做。

我所做的是:

代码语言:javascript
复制
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),也就是说,我不能去掉方括号。

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2014-11-16 09:58:58

在Prolog中,使用相同的不同性质的结构是非常罕见的。要向您展示一个可以使用但没有使用它们的地方,请考虑指令,因为它们用于声明谓词动态、多文件或不连续。比方说,我想声明a/2b/5动态。下列选项在ISO-Prolog中是可能的:

代码语言:javascript
复制
:- 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声明为前缀操作符(作为实现特定的扩展),因此您可以编写:

代码语言:javascript
复制
:- dynamic a/2.
:- dynamic b/5.

:- dynamic [a/2,b/5].

:- dynamic a/2, b/5.

然而,没有

代码语言:javascript
复制
:- dynamic(a/2,b/5).  % does not work

这符合你的想法。

如果您真的想要使用该表示形式,则需要使用(=..)/2。我想说这是许多潜在错误的来源。

想到的唯一一种情况是,通常使用“可变”性的结构是一组变量的紧凑表示,因为它们在setof/3的实现中使用。不是使用变量列表Vs,而是使用结构V

代码语言:javascript
复制
term_varvect(T, V) :-
    term_variables(T, Vs),
    V =.. ['.'|Vs].         % some use v instead of '.'

在具有有限max_arity的系统中,必须处理溢出情况:

代码语言:javascript
复制
term_varvect(T, V) :-
    term_variables(T, Vs),
    catch( V =.. ['.'|Vs],
           error(representation_error(max_arity), _),
           Vs = V).
票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/26955610

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档