标签: prolog-assert

Prolog:单引号和双引号的不同行为

我对 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请执行以下三个步骤:

  1. 使用 查找正确的记录user/3
  2. 使用 . 从数据库中删除一条匹配的记录retract/1
  3. 使用 . 将新的更新记录插入数据库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 行)?

portability prolog double-quotes prolog-assert

4
推荐指数
1
解决办法
413
查看次数

具有递增组件的动态Prolog谓词

我有一个知识库,由一组规则组成,每个规则的头部在某些条件发生时执行复杂术语的断言或撤销.

我怎样才能确保Id每个都递增 assert(term(Id,A,B,C))

global-variables prolog swi-prolog prolog-assert

3
推荐指数
2
解决办法
168
查看次数

Prolog动态谓词的基本用法

使用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

我想念什么基本概念?

prolog prolog-assert

2
推荐指数
1
解决办法
83
查看次数

断言和撤消以模拟全局变量

我这样做是为了模拟全局变量:

update_queue(NewItem) :-
    global_queue(Q),
    retractall(global_queue(Q)),
    append(Q, [NewItem], NewQ),
    assert(global_queue(NewQ)).
Run Code Online (Sandbox Code Playgroud)

还有另外一种方法吗?(除了将变量作为参数传递之外).不一定更有效率,我只是好奇.

global-variables prolog swi-prolog dcg prolog-assert

1
推荐指数
1
解决办法
470
查看次数

如何从用户输入 (PROLOG) 中断言新规则

我想接受用户的输入,即[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)

但这不起作用。是否可以使用变量作为谓词和事实?或者有没有其他方法可以实现这一目标?

input prolog rule fact prolog-assert

1
推荐指数
1
解决办法
1695
查看次数