Syntax 如何使Prolog语法看起来像一阶逻辑语法?

Syntax 如何使Prolog语法看起来像一阶逻辑语法?,syntax,prolog,Syntax,Prolog,我正在寻找使Prolog程序看起来更像一阶逻辑的方法。我想要的东西有: ->暗示 在-> ^对于连词v表示析取 或者是否有其他软件已经实现了这一点 提前谢谢 /JC 更新20190313 我按照下面答案中的建议尝试了以下方法: :- op(1200, xfx, ==>). :- op(1000, xfy, /\). :- op(1100, xfy, \/). term_expansion(A ==> B, B:- A). term_expansion(A /\ B, A, B).

我正在寻找使Prolog程序看起来更像一阶逻辑的方法。我想要的东西有:

->暗示 在-> ^对于连词v表示析取 或者是否有其他软件已经实现了这一点

提前谢谢

/JC

更新20190313 我按照下面答案中的建议尝试了以下方法:

:- op(1200, xfx, ==>).
:- op(1000, xfy, /\).
:- op(1100, xfy, \/).

term_expansion(A ==> B, B:- A).
term_expansion(A /\ B, A, B).
term_expansion(A \/ B, A; B).

man(X) /\ unmarried(X) ==> bachelor(X).

man(john).
man(peter).
unmarried(john).

main:-bachelor(X), writeln(X), nl, fail.
但我得到了以下错误:

ERROR: bachelor/1: Undefined procedure: (/\)/2
   Exception: (5) man(_1740)/\unmarried(_1740) ? 

但是,仅使用op/3和term_expansion/3 for==>可以按预期工作。不知道为什么会这样…

这里有一些Unicode字符可以帮助您:

¬ → ⇒ ← ⇐ ∨ ∧ ∀ ∃ 我将使用op/3定义合适的先例作为一项挑战


一旦你有了这些定义,你就可以用它们写出一级句子。然后,您可以将这些句子转换为Prolog,或使用Prolog解释它们。

以下是一些Unicode字符,可以帮助您:

¬ → ⇒ ← ⇐ ∨ ∧ ∀ ∃ 我将使用op/3定义合适的先例作为一项挑战


一旦你有了这些定义,你就可以用它们写出一级句子。然后,您可以将这些句子转换为Prolog,或用Prolog解释它们。

使用SWI Prolog上Prolog宏的术语\u expansion/2:

% calc.pl
:- op(1200,xfx,--).
term_expansion(A--B,B:-A).

integer(I)
--%----------------------- (E-Int)
I => I.

E1=>I1, E2=>I2, I is I1+I2
--%----------------------- (E-Add)
E1+E2 => I.

:- 1+2+3=>6.
:- 1+2+3=>I,writeln(I).
:- halt.

$ swipl calc.pl
6

使用术语_expansion/2,它是SWI Prolog上Prolog的宏:

% calc.pl
:- op(1200,xfx,--).
term_expansion(A--B,B:-A).

integer(I)
--%----------------------- (E-Int)
I => I.

E1=>I1, E2=>I2, I is I1+I2
--%----------------------- (E-Add)
E1+E2 => I.

:- 1+2+3=>6.
:- 1+2+3=>I,writeln(I).
:- halt.

$ swipl calc.pl
6

此答案涉及您更新的问题更新20190313

定义运算符时要小心:

不要重新定义标准运算符,更改其说明符/优先级

这会在现有代码中引入很难发现的错误

预先权衡利益和成本

以可读性、代码更短和括号更少为目标

请记住,使用过多的自定义Prolog运算符也会混淆代码并使读者感到困惑

在不同域中使用标准运算符之前,请三思

让我们以预定义的\//2为例


它是与is/2,=:=/2一起使用的算术表达式中的可计算函子,此答案涉及更新的问题更新20190313

定义运算符时要小心:

不要重新定义标准运算符,更改其说明符/优先级

这会在现有代码中引入很难发现的错误

预先权衡利益和成本

以可读性、代码更短和括号更少为目标

请记住,使用过多的自定义Prolog运算符也会混淆代码并使读者感到困惑

在不同域中使用标准运算符之前,请三思

让我们以预定义的\//2为例



它是is/2使用的算术表达式中的可计算函子,=:=/2,请尝试为其构建元解释器。@DanielLyons谢谢您的提示!试着为它构建一个元解释器。@DanielLyons谢谢你的提示!谢谢你的建议;看起来很有趣。我不完全理解这个例子,例如=>的含义是什么。术语A-B,B:-A是告诉Prolog用B:-A替换A-B的每个实例的一种方法吗?你能在网上给我举一些例子吗?谢谢你的建议;看起来很有趣。我不完全理解这个例子,例如=>的含义是什么。术语A-B,B:-A是告诉Prolog用B:-A替换A-B的每个实例的一种方法吗?你能在网上给我举一些例子吗?谢谢你的建议。我试过你的建议,看看我原来问题的更新。然而,我无法让它发挥作用。也许你知道怎么了。谢谢谢谢你的建议。我尝试了你的建议。请参阅我原始问题的更新。然而,我无法让它发挥作用。也许你知道怎么了。谢谢/什么是不同的领域?想想+/2代表is/2和=/2@false. 不同域:整数位或vs析取。域名是正确的词吗?有点像。然后,将-/ 2的R作为一对,作为算术表达式。我懂了。我重排了排名并添加了一些措辞。。。“希望”和“悲伤”是什么意思?想想+/2代表is/2和=/2@false. 不同域:整数位或vs析取。域名是正确的词吗?有点像。然后,将-/ 2的R作为一对,作为算术表达式。我懂了。我重排了排名并添加了一些措辞。。。希望现在更清楚。