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