2

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

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

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

4

2 回答 2

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 中并不真正存在函数。与关系模型一致,应该被视为可能无限的关系。出于实际目的,这些是为算术评估而实现的。一个名为 is/2 的内置函数引入了算术评估,一种子语言,其中我们有 +、sin 等函数......

于 2013-05-19T20:58:22.363 回答
0

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

如果你有一个谓词

bind('A').

定义,然后在任何其他谓词中,在调用之后

.... ,    %// #1
bind(X),  %// #2
....

X将保持'A'为点 #2 以下的值,直到回溯发生(如果有)回到点 #2 之上。

但是没有必要为此设置一个单独的bind谓词。统一用=/2内置操作符表示,同样的效果用

.... ,    %// #1
X = 'A',  %// #2
....

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

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

您可以稍后访问它

2 ?- Z = $X.
Z = 'A'.

但是,如果您想要更具体的东西,您应该在您选择的某个函子名称下将其声明到数据库中,正如 CapelliC 的回答中所建议的那样。

于 2013-05-20T09:20:03.793 回答