嗨我在Prolog中有一个由简单事实组成的数据库:
:-dynamic sportsmen/2.
sportsmen('Andrew', 'Shaw').
sportsmen('Patrick', 'Kane').
现在我想撤回一些事实。问题是,当我打电话
retract(sportsmen(_,'Kane'))
它返回true,但我的数据库没有变化,我试图在这里找到一个解决方案,我发现有一个有这个问题的人建议看看谓词告诉/ 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).