【发布时间】:2018-08-01 23:59:47
【问题描述】:
我正在尝试在 java 中实现 prolog 解释器。我试图弄清楚“,”运算符应该如何工作。我试图实现这样的等效规则:
and(A, B) :- A, B.
我正在使用测试用例 c1、c2 和 c3 基于以下逻辑库测试我的实现。他们都应该输出'1'和'false'。然而,我注意到最后一条规则 (c3) 打印出“12”和“假”。我在 SWI prolog 中运行了相同的测试,最后一条规则输出 '12' 和 'false'。
所以我的假设是不正确的,逗号运算符可以编码为','(X, Y) :- X, Y.?
n(1).
n(2).
and(X, Y) :- X, Y. % this is used to compare with the built in operator ','
c1 :- n(X), write(X), =(1, X), !, fail.
c2 :- ','(n(X), ','(write(X), ','(=(1, X), ','(!, fail)))).
c3 :- and(n(X), and(write(X), and(=(1, X), and(!, fail)))).
【问题讨论】:
-
剪切在调用它的谓词子句的上下文中应用修剪回溯。所以
and(!, fail)将在调用它的地方失败并回溯。而','(!, fail)与!, fail相同则不会回溯。所以and(!, fail)的行为与!, fail不一样。你必须写and(!, fail), !。 -
@lurker IOW 这更多是关于 cut 的语义而不是 and 的?
-
@DanielLyons 是的,绝对的。
-
@lurker,感谢您的回答。我需要咀嚼一段时间。我觉得难以理解的是,c1 显然等同于 c2,但 c2 不等同于 c3。 ',' 是一个运算符而 'and/2' 是一个规则这一事实似乎有所不同?
-
在 Prolog 中,有一个名为
write_canonical(X)的谓词,它可以让您按照 Prolog 的规范方式编写术语。试试write_canonical((A, B))。
标签: prolog prolog-cut