2

我在 Prolog 中定义过程时遇到问题。我有两个源文件,想用它们来咨询 Prolog 引擎。这可以通过调用 Prolog 作为 swipl -g “['1.pl','2.pl'] 来完成。

这两个文件都是由另一个用另一种编程语言编写的程序生成的,我无法事先预测文件的确切内容。

问题是在其中一个文件中总是有一条规则

predicate1(X):-predicate2(X).

但是,有时规则

predicate2(something):-body

两个文件中都不存在,并且在执行谓词 1 的某些查询时出现错误“谓词 2”未定义。

如果我包括该行

:- dynamic(predicate2/2). 

进入其中一个文件,只有在另一个文件中没有定义 predicate/2 时才有帮助(否则我会得到类似“你真的确定要重新定义 predicate2/2 吗?”。在这里我不想重新定义一些东西保存另一个文件中的数据。

所以,我不知道如何使谓词“定义”。我需要 SWI-Prolog 或 SICStus Prolog 的解决方案。(不幸的是,这些版本没有定义谓词的部分,如视觉 Prolog)

4

3 回答 3

3

您需要predicate2/2 multifile使用同名的 ISO 指令进行声明。所以在每个文件中,你写在顶部,或者在任何子句之前predicate2/2

:- multifile(predicate2/2).

无论您是否有该谓词的子句,这都是如此。


@CapelliC 的建议绝对是一个危险的举动。如果您关闭所有存在错误,您将错过许多合法错误!

例如,您声明dynamic(predicate2/2)但使用了predicate2(_). 所以你想要哪个arity?

于 2014-04-15T17:55:09.567 回答
2

在 SWI Prolog 中,您可以避免该错误。使用内置 ISO 更改系统行为

:- set_prolog_flag(unknown, Choice).

选择是(失败、警告、错误)之一。

所以你的命令行将是:

swipl -g “set_prolog_flag(unknown,fail),['1.pl','2.pl']."

另一种可能性:定义一个假程序

swipl -g “assert(predicate2(_):-fail),['1.pl','2.pl']."

高温高压

于 2011-12-31T11:20:36.080 回答
-1

显然,Prolog 无法回答我们提出的任何问题。例如,如果我们问唐纳德是不是一只鸭子

?- isDuck(Donald) .
! ----------------------------------------
! Error 20 : Predicate Not Defined
! Goal : isDuck(_17610)

Prolog 会回答它不知道“某物”是不是鸭子。正在发生的事情是逻辑谓词 isDuck/1未定义(谓词未定义),因此 Prolog 无法检查“某物”是否是鸭子。正如我们稍后将看到的,即使 Prolog 不知道什么是鸭子,也可以教它如何区分什么是鸭子和什么不是。正如我们之前所说,Prolog 是一种对话语言。在系统和程序员之间的对话中,Prolog 不仅能够回答某些问题,而且能够了解它不知道的东西。为了回答程序员提出的问题,Prolog 检查了一个知识库,其中注册了 Prolog 知道的所有内容。在 Prolog 会话开始时,知识库保留了基本知识,其中包括自然数算术的概念和定义。在会话期间,可以增加这个知识库,包括 Prolog 不熟悉的定义和概念(例如鸭子的定义),或者也可以修改和扩展 Prolog 知道的定义(例如,包括新的算术运算符对于自然数)。事实和规则表达了知识库。事实和规则是一阶喇叭子句的句法表示。因此,Prolog 的所有知识都使用(几乎)专门的一阶逻辑来表达。这就是为什么说 Prolog 是一种逻辑语言的原因。Prolog 中的程序是一组表达特定知识的事实和规则。或者修改和扩展 Prolog 知道的定义(例如,包括自然数的新算术运算符)。事实和规则表达了知识库。事实和规则是一阶喇叭子句的句法表示。因此,Prolog 的所有知识都使用(几乎)专门的一阶逻辑来表达。这就是为什么说 Prolog 是一种逻辑语言的原因。Prolog 中的程序是一组表达特定知识的事实和规则。或者修改和扩展 Prolog 知道的定义(例如,包括自然数的新算术运算符)。事实和规则表达了知识库。事实和规则是一阶喇叭子句的句法表示。因此,Prolog 的所有知识都使用(几乎)专门的一阶逻辑来表达。这就是为什么说 Prolog 是一种逻辑语言的原因。Prolog 中的程序是一组表达特定知识的事实和规则。这就是为什么说 Prolog 是一种逻辑语言的原因。Prolog 中的程序是一组表达特定知识的事实和规则。这就是为什么说 Prolog 是一种逻辑语言的原因。Prolog 中的程序是一组表达特定知识的事实和规则。


于 2014-04-15T16:50:02.287 回答