Prolog撤回不会改变数据库

时间:2014-05-14 16:34:36

标签: database prolog

#Retract不会更改数据库#

嗨我在Prolog中有一个由简单事实组成的数据库:

:-dynamic sportsmen/2.
sportsmen('Andrew', 'Shaw').
sportsmen('Patrick', 'Kane').

现在我想撤回一些事实。问题是,当我打电话   retract(sportsmen(_,'Kane')) 它返回true,但我的数据库没有变化,我试图在这里找到一个解决方案,我发现有一个有这个问题的人建议看看谓词告诉/ 1。我知道这个谓词正在做什么,但我无法弄清楚如何将所有剩余的事实写回数据库除了我要删除的那个。

任何人都可以帮忙吗?

1 个答案:

答案 0 :(得分:1)

撤回工作。它从内存中的数据库中撤回。它从您的文件中删除事实:

$ cat foo.pl

:-dynamic( sportsmen/2 ).

sportsmen('Andrew', 'Shaw').
sportsmen('Patrick', 'Kane').

运行prolog:

$ gprolog
GNU Prolog 1.4.2
By Daniel Diaz
Copyright (C) 1999-2012 Daniel Diaz

加载foo.pl文件:

| ?- [foo].
compiling /home/mark/src/prolog/_play_/foo.pl for byte code...
/home/mark/src/prolog/_play_/foo.pl compiled, 6 lines read - 398 bytes written, 13 ms

(1 ms) yes

请注意事实存在:

| ?- listing.

% file: /home/mark/src/prolog/_play_/foo.pl

sportsmen('Andrew', 'Shaw').
sportsmen('Patrick', 'Kane').

(1 ms) yes

撤回其中一项事实:

| ?- retract(sportsmen(_, 'Kane')).

yes

请注意事实已被收回:

| ?- listing.

% file: /home/mark/src/prolog/_play_/foo.pl

sportsmen('Andrew', 'Shaw').

yes

退出序言:

| ?- ^D

请注意,事实仍然存在于文件中:

$ cat foo.pl

:-dynamic( sportsmen/2 ).

sportsmen('Andrew', 'Shaw').
sportsmen('Patrick', 'Kane').

<小时/> 如果你想在文件中维护一些事实,你可以在内存中进行数据库操作,如上所示,然后使用Prolog文件I / O谓词来写出更新的事实。例如,要保存一组给定的sportsmen事实,请使用爱丁堡风格的I / O谓词:

telling(OldStream),
tell('sportsmen.pl'),
write(':- dynamic sportsmen/2.'), nl,
listing(sportsmen),
told,
tell(OldStream).