问题标签 [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 - SWI-Prolog 动态/1 与动态/2
我正在自学 Prolog,并获得了一些示例。
其中之一使用dynamic/1
内置指令:
我得到了动态的想法。那可以通过断言修改谓词,并收回谓词。
但是,该程序还在某些地方使用以下内容:
两个/1和/2有什么区别,它们也是/3 .... /n吗?
prolog - 在 Prolog 中撤回并断言到另一个文件
我试图在另一个文件中撤回并断言一个事实。一个 (fruit1.pl) 包含几个事实,另一个 (fruit.pl) 包含一个谓词,该谓词指定另一个谓词将更新start
哪个事实:insert_fruit
水果1.pl
水果.pl
但是insert_fruit
没有按预期工作,因为我认为它需要包含 Stream 来修改另一个文件,尽管我不知道如何(retract(Stream, ...)
不起作用)。是否有一些我可以让撤回和断言谓词在另一个文件中起作用?
prolog - 在 Prolog 中处理动态谓词的正确方法
我正在为机器人系统编写知识库。该系统实际上由两部分组成:知识库中的规则和传感器读数生成的一组谓词。
例如,可能的规则:
传感系统产生如下谓词:
工作流程包括咨询传感器生成的谓词,咨询规则引擎,然后查询要做什么。(例如做(X)。)
问题是,如果(例如)canSee谓词不是由传感器产生的,prolog在查看规则do(shoot(E))时会抱怨Undefined procedure。
一种可能的解决方法是在规则中生成基本谓词列表(如canSee(nothing)),但我不确定这是最好的方法。
有任何想法吗?
prolog - 无法在 SWI-Prolog 中使事实动态化
我希望能够为该过程动态撤回和断言事实location
:
根据在线建议(包括No permission to modify static procedure),我尝试将以下各项添加到我的源代码中,否则仅包含上述断言:
前两个版本在编译时(加载到 SWI-Prolog 时)给了我这个错误:
上一个版本在编译时不会给我一个错误,但是,无论我把它放在文件的开头还是结尾,当我尝试收回我的事实时都会出错:
我正在使用 SWI-Prolog 版本 6.6.5。
csv - 为多个表调整 csv 读取
我有以下内容:
调整它的最佳方法是什么,以便 prepare_db 可以采用两个额外的参数来定义 column_keys 和 mb 的谓词。
例如?-prepare_db('my_file.csv',mb_column_keys,mb).
将导致事实被断言为 mb/3 和 mb_column_keys/1
好的,我已将文件更改为以下内容:
但它确实看起来有点难看,有没有更优雅的方法来完成这个?
module - 具有动态谓词的模块
这是一个后续问题:Adapting csv reading for multiple tables
如果我定义了以下模块:
然后我可以从 csv 文件中读取表格。
例如:
然后我会有一个事实mt_col_key([col1,col2,...,coln])
和一组事实mt_relation/3
。但这些将是模块本地的,不会被导出。我需要使用csv_load_mod:mt_relation/3
等。有没有办法让模块导出动态谓词或进行调整prepare_db/3
,以便它断言的事实不是本地的,或者它们被断言到调用它的模块?
prolog - Prolog - 咨询实际上清除了当前状态?
我有以下用于客户创建和列表的代码:
到目前为止,一切都很好。问题是,当尝试进行更复杂的搜索、过滤和报告时,我不得不使用retract
来清理客户的当前内存状态。
因此,在任何列表之前,我倾向于再次查阅文件(调用load
):
这里的问题是,这种新的负载会导致listing
重复添加到数据库中的最后一个客户。
例如:
C:\customers.txt:
清单(客户):
我已经能够通过retractall
在咨询之前使用来避免这种情况:
这是一个好/坏的做法吗?我不太明白这里发生了什么或为什么这能解决问题。
prolog - current_predicate/1 不适用于 :- 动态?
我有一些使用 Prolog 中的断言定义的谓词。
我使用current_predicate/1
它是为了知道断言是否已经运行(只需要断言一个值)。
然而,swipl
一直在抱怨:
因此,我添加了,但不幸的是,这会将谓词添加到 current_predicate(Predicate).. 因此,如果我使用此动态命名,:- dynamic amountOfStudentsInCourseAsserted/2
我将无法再使用。current_predicate/1
对于动态名称,是否还有另一个这样的谓词current_predicate/1
不正确?
arrays - 在 prolog 中断言和使用快速的大型数组
我正在使用仿函数在 SWI-Prolog 中使用 arg/3 获取随机访问数组。我正在做的是将样本中的值加载到我创建的仿函数中并声明该数组以供将来使用。
加载后,随机访问确实是 O(1),因为我已经使用 time/1 进行了验证。问题是从断言中加载函子需要很长时间( time/1 表明它在数组的大小上是线性的)。有什么办法可以将其加速到恒定时间吗?
复制的最小代码:
prolog - Prolog - 通过演绎减少知识库
我需要创建一个规则来搜索与 my_rule 匹配的事实。这些事实将用于改变知识库。( my_rule (Conclusion, Premise)
)。
我有这个知识库开始:
找到规则后,代码将搜索数据库中是否存在结论及其前提。
我不知道如何做到这一点,是的,这是一个家庭作业。我只想有人指出从哪里开始。
谢谢。