问题标签 [prolog-assert]

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.

0 投票
1 回答
412 浏览

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,以便它断言的事实不是本地的,或者它们被断言到调用它的模块?

0 投票
4 回答
626 浏览

prolog - 不使用递归的阶乘计算

我正在尝试在不使用递归的情况下实现阶乘计算(n!)的解决方案,仅使用序言的追溯。例如:

使用固定事实factorial,如果我调用谓词追溯来发现 2 的阶乘,例如,我会收到正确的答案:

我正在尝试实施的解决方案是:

如果我尝试获得大于 1 的数字的阶乘,则不起作用。有人知道为什么吗?

0 投票
1 回答
444 浏览

prolog - 使用 Prolog 读入输入

抱歉,如果这很明显,但我最近一直在学习 prolog,并试图读入数据以在推荐系统中使用。

前面的代码应该读入用户希望花费的金额,然后询问受赠人的个性,然而,只询问第一个问题。它似乎进入了新行,但没有断言谓词:

?- will_spend(30)。[警告:未定义谓词:will_spend/1']

这是为什么,我做错了什么?在此先感谢您的帮助。

0 投票
1 回答
537 浏览

prolog - 在数据库中更新/添加事实的最佳方式?

假设我有这样的事实:

我想要这样的东西(伪代码):


我尝试了 2 种不同的方法。第一个我不太喜欢:

第二个不起作用:

因为当Fact不成功时Amt没有实例化,所以我总是得到NewAmt is Val.

0 投票
1 回答
165 浏览

dynamic - PROLOG 收回它不工作

我需要从谓词列表中删除一个项目,但它不起作用。它对我来说返回 true,但该项目仍然存在。

代码:

0 投票
1 回答
196 浏览

prolog - 专家系统中的 Prolog 和“反向”输出

我是 Prolog 的新手。我想知道如何做简单的专家系统,比如

这很好,但问题是 - 如何进行“后退”输出,例如,我将在序言窗口中输入“坦克”,他将给出这个坦克的所有部件 - 比如枪 - 是的,短步枪 -是的,翅膀 - 不,等等

是否有可能在这样的专家系统中做,或者我必须做另一个程序?

感谢你的回复

0 投票
2 回答
306 浏览

prolog - Prolog:单引号和双引号的不同行为

我对 Prolog 很陌生,我偶然发现了一些我不明白的东西。

这是我的代码:

要更新数据库中的用户信息,请 changeAge/2执行以下三个步骤:

  1. 查找正确的记录,使用user/3.
  2. 使用 . 从数据库中删除一条匹配记录retract/1
  3. 使用 . 将新的更新记录插入数据库assert/1

这是我的控制台输出:

true当双引号给我(第4行)时,为什么单引号给我(第2false行)?

0 投票
3 回答
3194 浏览

prolog - abolish/1 和retractall/1 有什么区别?

通过阅读手册,我似乎无法找到两者之间的区别。

手册说:

建议使用retractall/1 来删除动态谓词的所有子句。

所以我选择retractall/1在我的程序中使用;但是,我想知道有什么区别。

0 投票
4 回答
1137 浏览

list - 如何在 Prolog 中使用动态数据库?

我编写了以下程序,它计算输入数组的最长非递减子序列。

从列表列表中查找最长列表的子程序取自stackoverflow(如何在列表列表中找到最长列表)本身。

我使用 Prolog 动态数据库进行记忆。虽然有数据库的程序比没有数据库的程序运行得慢。以下是两次运行之间的比较时间。

我想知道我是否正确使用了动态数据库。谢谢!

0 投票
1 回答
96 浏览

prolog - Prolog:包含断言的规则仅将第一个结果添加到事实

我正在尝试预先计算一些东西并将结果保存为程序开头的事实:(简化代码)

但是当我在 SICStus Prolog 中查阅文件时,只有第一个结果 cost(1,20) 被断言:

但是,当我直接在 SICStus prolog 控制台中输入 assert_all 的右侧时,两个 cost/2 事实都在那里。

我发现这种行为非常令人困惑,这是怎么回事?