Prolog中的重定义与算子

Prolog中的重定义与算子,prolog,operator-overloading,operators,operator-keyword,Prolog,Operator Overloading,Operators,Operator Keyword,我想在SWI Prolog中重新定义AND运算符。但我不知道怎么做。 我尝试了以下定义: a & b = b & a 但是,它被报告为递归的,不起作用。 希望大家给我建议。 提前谢谢 您可以按如下方式“定义”和: and(t,X,X) :- bool(X). and(f,X,f) :- bool(X). bool(t). bool(f). 第三个参数是第一个参数和第二个参数连接的结果 当然,这只是一个练习,但确实很难回答您的问题,因为您的问题并不十分清楚。您可以使用在SW

我想在SWI Prolog中重新定义AND运算符。但我不知道怎么做。 我尝试了以下定义:

a & b = b & a
但是,它被报告为递归的,不起作用。 希望大家给我建议。 提前谢谢

您可以按如下方式“定义”

and(t,X,X) :- bool(X).
and(f,X,f) :- bool(X).
bool(t).
bool(f).  
第三个参数是第一个参数和第二个参数连接的结果


当然,这只是一个练习,但确实很难回答您的问题,因为您的问题并不十分清楚。

您可以使用在SWI Prolog中定义运算符,例如通过在程序中添加以下内容:

:-op(1000,xfy,用户:(&))。

请注意,优先级(
1000
)和类型(
xfy
)与SWI Prolog中已定义的连词运算符的优先级和类型相同(即,请参阅)

然后,一旦声明,您就可以如下定义
&
的语义:

and(t,X,X) :- bool(X).
and(f,X,f) :- bool(X).
bool(t).
bool(f).  
”和“(A,B):-A,B.


这两个定义合在一起将允许您使用
串联作为
的替换,
表示包含它们的程序中的连词。

不清楚重新定义AND运算符的含义。在Prolog中是(',')/2;您不能更改其定义。@false这是不正确的。请参阅下面的答案。@aBathologist:OP询问有关重新定义AND运算符的问题。而且,正如sharky观察到的,Prolog中的And运算符是
(',')/2
。除此之外,这样做是毫无意义的。@false@false一定是有一些沟通错误。这里是我的来源:《SWI Prolog手册》第4.25节开始,“定义运算符是为了提高源代码的可读性。例如,如果没有运算符,要写2*3+4*5就必须写+((2,3),*(4,5))。在Prolog中,已经预定义了许多运算符。除了逗号(,)之外的所有运算符可以由用户重新定义。”运算符是语法糖。重新定义操作符意味着改变味道。这只是关于代码*的外观<代码>A&B
对我来说,比
A,B
要明确得多。那么,这怎么会毫无意义呢?@ErikKaplun:这个问题适用于任何序言,因此序言特定的标记都没有帮助。据我所知,这个答案与这个问题完全无关,这个问题非常清楚,鲨鱼也回答得很好。删除它可能是个好主意。@aBathologist:这可能是对一个不太清楚的问题的有效答案。@false重读一遍,我明白你的意思了。我仍然认为问题很清楚,因为他问如何重新定义AND运算符,而不是如何定义新函数AND/3。然而,我可以肯定地看到这个答案如何提供关于和的基本概念结构的有用信息。我同意我的删除建议没有多大帮助。谢谢!您的解释清楚地说明了运算符定义的细节,我还没有完全掌握。很高兴,我很高兴这个答案仍然对其他人有帮助!:-)