- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我有一个包含大量事实的序言数据库文件 knowledge.pl
。例如:
father_of(joe,paul).
father_of(joe,mary).
mother_of(jane,paul).
mother_of(jane,mary).
male(paul).
male(joe).
female(mary).
female(jane). % and so on.
每次再次执行我的程序时,都会查阅此文件 (consult/1)。
我希望能够通过直接在此数据库文本文件中写入或删除来插入、修改和删除我想要的事实(其中一些是直接的,另一些是满足某些特定条件的)。
类似于 assertz、retract 和 retractall 但修改此文本文件以便更改永久保留在那里。
我该怎么做?
最佳答案
您可以创建所需的事实并将它们写入(相同的)文件或修改数据库,然后将其保存在文件中。
不同之处在于,使用第一种方法,您将加载旧文件的数据库,而第二种方法将在执行期间更改它。
从你表述问题的方式来看,我假设你想做第二个;为此,您应该:
1) 将所有要更改的谓词声明为 dynamic2)执行期间断言,撤回等3)将新数据库写入文件。你可以使用 listing/1
要写你可以这样做:
tell(knowledge),
.....
told.
或者您可以使用其他一些 io predicates .也许使用 set_prolog_IO/3将是最简单的方法。
现在,如果您想要第一个,您应该构造谓词(可能使用 univ operator )或其他字符串操作谓词,然后将它们写入文件
编辑:
有 listing/0 但它会列出所有加载的谓词(你可能不想要的东西)。经过一番搜索,我找到了 source_file/2 ;所以你可以做类似的事情
findall(X,source_file(X,FileName),L).
请注意,source_file/2 需要绝对 文件名。你可以使用 absolute_file_name/2为拿到它,为实现它source_file/2 格式化谓词的方式有点奇怪(我期待像 foo/1 这样的东西)但看起来你可以把它给 listing/1 并且它工作正常所以你可以做这样的事情:
save(FileName):-
absolute_file_name(FileName,Abs),
findall(X,source_file(X,Abs),L),
tell(FileName),
maplist(listing,L),
told.
另一方面,您始终可以拥有一个包含要存储在文件中某处的谓词的列表
关于database - Prolog 在单独的数据库文本文件上插入、修改和删除事实,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10857202/
我正在尝试使用以下命令通过 ansible 收集服务器 list : ansible all -m setup -a --tree facts/ 但这会在facts文件夹下为每个主机生成很多操作系统单
我决定学习 prolog 只是为了好玩,我正在看一些视频教程。我也在互联网上搜索了一些问题试图解决,但找不到解决方法。 我能够在纸上解决这个难题,但无法将其传递到代码中。 问题: I have 8 c
我正在通过DRT(规则模板)读取Excel表,然后通过Java类中的静态方法将其转换为类的对象。并将其插入到工作内存中。这样,工作内存就会被 Excel 表格中的所有事实填满。 现在,我通过 sess
我确信这非常简单,但我显然没有用谷歌搜索正确的东西。在几个单元测试相关的博客中,我看到了几个方法被赋予的属性 [fact] ,但我似乎无法弄清楚这意味着什么。示例: public class Some
我想知道这些术语之间的区别: 事实 仿函数 谓词。 规则 在Prolog中。 如果我写:brother(john, jack).这是事实吗?或谓词? 最佳答案 从 ISO/IEC 13211-1 Fi
问题 为什么选择 Ansible 事实,例如 ansible_distribution在角色部分不可用? --- - name: Test hosts: all tasks: - na
puppet 事实看起来像这样: processors => {"models"=>["AMD Opteron(tm) Processor 6172", "AMD Opteron(tm) Proces
在做了一些研究之后,我对 Prolog 以非常简单的方式表达查询的能力感到惊讶,几乎就像口头告诉机器该做什么一样。发生这种情况是因为我对工作中的 Propel 和 PHP 感到非常厌烦。 所以,我一直
我想生成一个密码和其他一些不存在的值。 像这样的东西: - name: Retrieve or generate my_password generated_fact: shell: so
我需要从 SEC 10-K 文件中获取一些事实,例如毛收入、毛利润、毛利率、营业费用等以及相应的上下文。 对于像 https://www.sec.gov/Archives/edgar/data/131
我是 puppet 新手,并计划在我们的环境中实现它。 我有在不同版本的 Redhat 上运行的 puppet 代理。 现在,我计划从 puppet master 推送存储库文件,我需要您的指导来实现
我是 puppet 新手,并计划在我们的环境中实现它。 我有在不同版本的 Redhat 上运行的 puppet 代理。 现在,我计划从 puppet master 推送存储库文件,我需要您的指导来实现
是否可以使用通常包含在 ansible_facts 中的内容?在 Ansible 临时命令中? 例如,我有一个位于 /tmp/myFile 的文件。在我所有的服务器上,我想做: ansible all
获得正确的术语是成功传达概念的一部分,当在 SO 中使用错误的术语时,带有 Prolog 标签的受访者会很好地指出错误。 在阅读 William F. Clocksin 于 1997 年 ( Worl
上下文:我的系统包含来自不同存储 Controller 的磁盘组合,因此每种类型的磁盘都有不同的用途。我是 ansible 的新手,我一边学习一边学习。编写一个剧本,从每种类型的 Controller
我是数据仓库的新手,我希望有一个关于构建星型模式的简单问题: 如果我有一个事实表,其中事实记录自然与单个维度具有一对多关系,那么如何建模星型模式来支持这一点?例如: 事实表:销售点条目(衡量标准是美元
我正在用 Idris 编写一个基本的 monadic 解析器,以适应与 Haskell 的语法和差异。我有基本的工作,但我坚持尝试为解析器创建 VerifiedSemigroup 和 Verified
我的应用程序需要足够的准确性,但 Google Places 按类别过滤的准确性似乎很差。所以我正在考虑迁移到 Factual API。大家用过吗?您如何看待它的准确性? 另一方面,我需要知道到某个地
我是一名优秀的程序员,十分优秀!