问题标签 [prolog-directive-dynamic]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
prolog - 序言中的“动态”谓词
如果我想使规则动态化,以便在加载数据库文件后使用断言,我该怎么做?我现在正在使用 XSB Prolog,文件是这样的:
当我尝试使用 XSB 查阅文件时,出现错误:
有任何想法吗?
performance - Prolog 中的高效可变图表示?
我想以一种有效的方式在 Prolog 中表示一个可变图。我将在图中搜索子集并用其他子集替换它们。
我已经设法使用数据库作为我的“图形存储”来工作。例如,我有:
retract
然后,我对匹配的子集使用一些规则,并使用assert
. 我真的很喜欢这种方法……它易于阅读和处理,我让 Prolog 完成了很多繁重的模式匹配工作。
我知道的另一种表示图形的方法是使用节点列表和邻接连接。我见过很多网站都使用这种方法,但我有点犹豫,因为它的开销更大。
执行时间对我来说很重要,对我来说易于开发也很重要。
这两种方法的优缺点是什么?
prolog - 谓词缓存
是否有缓存谓词的 Prolog 实现或库?
或者你会使用assertz/1和retract/1实现一个FIFO缓存,像这样:
在 ECLiPSe-CLP 中,至少可以使用额外的逻辑变量替换 findall/3 行:
在我的机器上,对此 ccall/1 的 1000 次调用需要 >4.00 cpu sec,而实际目标 cpu 时间可以忽略不计(0.04 cpu sec)。所以我猜想在解释器内部实现的缓存(特别是 LRU 缓存左右)仍然会优于 assertz/1 和retract/1。
我不想为每个谓词都缓存,当然,只缓存极少数谓词。一个场景可能是这样的:p([H|T], E) :- q(H,E) ; p(T,E)
没有q/2
副作用。p/2
需要一个稳定增长的列表,但总是/经常是相同的E
。
prolog - 我可以在 assert/1 中使用变量吗?
我现在检查 X(Y) 在我的小数据库中不是一个公认的事实。由于 X(Y) 返回 false,它将尝试断言它。(我意识到当 X 是规则而不是事实时,这会带来问题)
例如,假设这个事实在数据库中
我问 ifNotAdd(哺乳动物,大象)。
我想让它看到吗?哺乳动物(大象)。为假,然后断言哺乳动物(大象)。
显然是“断言(X(Y))”。线是错误的,但我用什么来代替它?我正在搜索序言文档和论坛来寻找答案,但到目前为止还没有运气。我也在尝试写一些可以自己完成的东西。
编辑 我需要编辑数据库以获得用户可以与之交互的动态数据库。我正在构建一个论证机器,我需要允许用户告诉系统他们“肯定知道事实”,以便系统可以处理其领域之外的知识。
在http://en.wikipedia.org/wiki/Reason_maintenance的脉络中
干杯,
prolog - 我想在序言中创建动态事实
我写了以下简单的代码,我希望当我写“男性”时,这段代码会问我一次“它是男性吗?” 如果我输入“否”,它会在屏幕上写下“她是女性”。
但此代码有以下错误:
swi-prolog 中的错误是:
prolog - 序言中没有头的子句是什么意思?
在 Prolog 程序的开头,我看到:
这似乎是一个没有头的子句。这是什么意思?
list - 不可预测的动态谓词行为
我有一个问题,需要我将元素添加到分布在各种谓词中的列表中。我选择使用动态列表谓词,而不是通过基于参数的列表。我简单的例子可以在下面看到。当我最初使用它时它工作得很好,但现在如果我使用任何参数作为 X,即使在关闭程序并重新编译之后,它也会继续从列表中检索以前的参数数据。有人知道它有什么问题吗?
prolog - 我可以使用 Prolog 从另一个文件中检索信息吗?
我正在尝试编写一个简单的翻译脚本,但文件变得相当……冗长且令人困惑,主要是因为我已将所有翻译存储在文件末尾。它们的格式为动词(英语、芬兰语)。
我想知道是否有任何方法可以将它们存储在不同的文件中,所以我不需要处理它们。我已经研究过使用咨询谓词,但我认为这并不完全符合我的需要。有没有办法在 SWI-prolog 中做到这一点?
作为记录,如果我使用咨询谓词,我会收到以下错误消息:
但是,如果我尝试使用咨询谓词,则会收到此错误:
prolog - Prolog获取动态事实值
在学习 Prolog 时,我正在编写一个基于文本的游戏,这是其中的一部分:
我收到一个关于静态程序的错误,但一个简单的搜索修复了它,在运行游戏时我会很快说dynamic stat/3
。然而,在那之后,我在声明 Health 变量的文件中进一步收到错误:
我将问题缩小到这个(序言控制台):
在被声明为动态后,它不再在静态数据库中。但是通过谷歌搜索,找不到与我的问题相同的案例。我只需要查询和撤回/断言一个数据库。