在Prolog中绑定符号和查询符号值

时间:2013-05-19 20:31:11

标签: variables binding prolog

在SWI Prolog中做一些非常基本的事情我有些困难。对于初学者,如何使用将符号绑定到值的函数?这是我尝试过的,我不知道它是否正确:

bind(Name) :- assert(Name = 'A').

现在,如果我在解释器中运行bind(Test).,我希望将符号Test绑定到值'A'。这是这样做的吗?如果是,我该如何查询符号的值?

2 个答案:

答案 0 :(得分:0)

Prolog有一个关系数据模型。每个谓词都可以看作是关系数据库的表。然后你的关联可以用二元谓词建模:

:- dynamic symbol_value/2.

存储绑定:

bind(Name, Value) :- assert(symbol_value(Name, Value)).

查询值:

?- symbol_value(S, V).

联接只是连词:

% two different symbols with same value ?
?- symbol_value(S1, V), symbol_value(S2, V), S1 \= S2.

Prolog中并不存在功能。与关系模型相关,应该被视为可能无限的关系。出于实际目的,这些是为了算术评估而实现的。一个内置命名为/ 2引入算术评估,一个子语言,我们有+,sin等函数...

答案 1 :(得分:0)

您是否在询问Prolog中统一这样一个非常基本的事情?

如果你有谓词

bind('A').

在调用

后定义,然后在任何其他谓词中定义
.... ,    %// #1
bind(X),  %// #2
....

X'A'保留为低于第2点的值,直到回溯发生(如果有)回到#2点之上。

但是不需要单独的bind谓词。统一用=/2 built-in operator表示,使用

也可以达到同样的效果
.... ,    %// #1
X = 'A',  %// #2
....

如果您在SWI Prolog控制台中尝试此操作,

1 ?- X = 'A'.
X = 'A'.

您可以稍后以

的身份访问它
2 ?- Z = $X.
Z = 'A'.

但是如果你想要更有形的东西,你应该按照你选择的一些仿函数名称将它置于数据库中,正如你在CapelliC的答案中所建议的那样。