我对 Prolog 很陌生,我偶然发现了一些我不明白的东西。
这是我的代码:
:- dynamic user/3.
user('id', 'Name', 20).
changeAge(Id, NewAge) :-
user(Id, Name, _),
retract(user(Id,_,_)),
assert(user(Id,Name,NewAge)).
Run Code Online (Sandbox Code Playgroud)
要更新数据库中的用户信息,
changeAge/2请执行以下三个步骤:
user/3。retract/1。assert/1。这是我的控制台输出:
1 ?- user('id', _, Age).
Age = 20.
2 ?- changeAge('id', 25).
true.
3 ?- user('id', _, Age).
Age = 25.
4 ?- changeAge("id", 30).
false.
5 ?- user('id', _, Age).
Age = 25.
Run Code Online (Sandbox Code Playgroud)
为什么单引号给我true(第 2 行),而双引号给我false(第 4 行)?
我有一个知识库,由一组规则组成,每个规则的头部在某些条件发生时执行复杂术语的断言或撤销.
我怎样才能确保Id每个都递增
assert(term(Id,A,B,C))?
使用https://swish.swi-prolog.org获得此知识库
:- dynamic happy/1.
go:-
assert(happy(mia)),
write(happy(mia)).
Run Code Online (Sandbox Code Playgroud)
如果我跑步go.我会得到
happy(mia)
true
Run Code Online (Sandbox Code Playgroud)
如果我有
:- dynamic happy/1.
assert(happy(mia)).
Run Code Online (Sandbox Code Playgroud)
跑步happy(mia),我得到false。
我想念什么基本概念?
我这样做是为了模拟全局变量:
update_queue(NewItem) :-
global_queue(Q),
retractall(global_queue(Q)),
append(Q, [NewItem], NewQ),
assert(global_queue(NewQ)).
Run Code Online (Sandbox Code Playgroud)
还有另外一种方法吗?(除了将变量作为参数传递之外).不一定更有效率,我只是好奇.
我想接受用户的输入,即[garfield, hates, blacky].
hates/2当前不存在。
在我的数据库中,
process:-
read(Input_List),
add_rule(Input_List).
add_rule([X, Predicate, Y]):-
assertz(Predicate(X, Y)).
Run Code Online (Sandbox Code Playgroud)
但这不起作用。是否可以使用变量作为谓词和事实?或者有没有其他方法可以实现这一目标?