【问题标题】:PROLOG result vs truePROLOG 结果与真
【发布时间】:2023-03-12 02:50:01
【问题描述】:

我在名为“testing.pl”的文件中有下一个代码:

fact(1).
fact(2).
fact(3).

funcA(X) :- funcB(X).

funcB(X) :- fact(X).

testing :- funcA(_X).

然后,在 SWI-Prolog 解释器中,我查询 funcA(X).,输出为:

X = 1 ;
X = 2 ;
X = 3.

但是,每当我查询 testing. 时,输出是:

true ;
true ;
true.

所以,我的问题是:

如何将一条规则的结论用作另一条规则的前提(testing 右侧的funcA(X)),但效果与我查询该前提(funcA(X))的效果相同?

在上面的示例中,我想在我的“testing.pl”文件的某个位置写入testing.,并让 funcA(X) 执行与使用解释器查询时相同的操作,因此 funcB( X) 将检查 X 可以从 fact(N) 中获取的所有值并返回它。

我希望的结果是写testing. 并出现在屏幕上:

X = 1 ;
X = 2 ;
X = 3.

谢谢。

【问题讨论】:

  • 如果您希望testing. 产生X = 1, ...,那么您需要将X 作为testing 的参数。所以,testing(X) :- funcA(X).(这似乎没有添加任何目的)。或者,不太理想的是,您可以编写结果:testing :- funcA(X), write('X = '), write(X), nl.

标签: prolog prolog-toplevel


【解决方案1】:

您可以手动在终端上打印任何内容,例如使用 portray_clause/1format/2 等谓词。

您需要的唯一附加部分是一种强制回溯所有答案的方法。一种方法是using false/0

所以,在你的情况下,你可以写例如:

测试:- 函数A(X), format("X = ~q ;~n", [X]), 错误

现在调用 testing/0 产生,没有任何进一步的交互

?- 测试。 X = 1; X = 2; X = 3 ;

此外,谓词现在失败,因此如果您以交互方式(从顶层)使用它,您也会得到false/0,但如果您调用@987654327,不会 @ 从外壳通过swipl -g testing ...

还可以查看重要的 variable_names/1 选项,该选项可用于使用预期的变量名称。

我喜欢根据您的确切用例定制此输出作为练习。理想情况下,输出应该是一个正确的 Prolog 术语,这样您就可以通过read/1 阅读它并将其与参考结果进行比较来轻松地测试它。 p>

【讨论】:

  • 非常好的答案,但我提出的问题只是我真实代码的抽象,不幸的是它是交互式的(在菜单循环中)。所以它陷入了虚假。无论如何,这是我所问的答案,非常感谢。
  • 不客气。让我也谈谈您的实际代码:一个干净的出路是首先将杂质(即输入/输出)从实际程序逻辑中分离。例如,要以 方式表示菜单,请使用像 menu0_key_menu/3 这样的谓词,将菜单的一个状态关联菜单的新状态,具体取决于Key 被按下。这样,您实际上可以通过推理这种纯粹的关系来测试菜单的行为方式,通过简单地在目标中提供它们来“模拟”实际的按键,例如menu0_key_menu(M0, q, exit).,这应该成功(例如)。
猜你喜欢
  • 2016-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-02-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多