我在 SWI Prolog 中做一些非常基本的事情时遇到了一些困难。对于初学者,我如何拥有一个将符号绑定到值的函数?这是我试过的,我不知道它是否正确:
bind(Name) :- assert(Name = 'A').
现在,如果我bind(Test).
在解释器中运行,我希望将符号Test
绑定到 value 'A'
。这是这样做的方法吗?如果是,我该如何查询符号的值?
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 等函数......
您是在问 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 的回答中所建议的那样。