prolog - Prolog:在 Prolog 中定义逻辑运算符作为其他运算符的占位符
问题描述
我的目标是在prolog中写一个小证明助手。我的第一步是定义逻辑连接词如下:
:-op(800, fx, -).
:-op(801, xfy, &).
:-op(802, xfy, v).
:-op(803, xfy, ->).
:-op(804, xfy, <->).
:-op(800, xfy, #).
&
最后一个运算符 # 只是具有作为、或的占位符的v
含义。我的问题是,我不知道如何在 prolog 中定义它。我试图通过以下方式解决我的问题:->
<->
X # Y :- X v Y; X & Y; X -> Y; X <-> Y.
但以下定义:
proposition(X) :- atomicproposition(X).
proposition(X # Y) :- proposition(X), proposition(Y).
proposition(- X) :- proposition(X).
和
atomicproposition(a).
给
?- proposition(a v -a).
false
我做错了什么?
解决方案
您不能以这种方式定义句法同义词。当你定义类似的东西时
X # Y :-
X & Y.
您定义语义:“执行X # Y
,执行X & Y
”。但是您还没有定义任何“执行X & Y
”的方式:
?- X # Y.
ERROR: Undefined procedure: (&)/2
ERROR: In:
ERROR: [9] _2406&_2408
ERROR: [8] _2432#_2434 at /home/isabelle/op.pl:13
ERROR: [7] <user>
(即使你已经为它定义了一些含义,它也可能不是你想要的。)
相反,您正在寻找的是一种定义“不仅T
是带有二元运算符的术语”的概念的方法,而且理想情况下也是“T
的操作数是X
和Y
”。像这样:
binary_x_y(X v Y, X, Y).
binary_x_y(X & Y, X, Y).
binary_x_y(X -> Y, X, Y).
binary_x_y(X <-> Y, X, Y).
然后,使用:
proposition(X) :-
atomicproposition(X).
proposition(Binary) :-
binary_x_y(Binary, X, Y),
proposition(X),
proposition(Y).
proposition(- X) :-
proposition(X).
atomicproposition(a).
我们得到:
?- proposition(a v -a).
true ;
false.
?- proposition(P).
P = a ;
P = (a v a) ;
P = (a v a v a) ;
P = (a v a v a v a) ;
P = (a v a v a v a v a) ;
P = (a v a v a v a v a v a) . % unfair enumeration
还有其他方法可以用更少的输入来表达相同的关系,例如:
binary_x_y(Binary, X, Y) :-
Binary =.. [Op, X, Y], % Binary is of the form Op(X, Y)
member(Op, [v, &, ->, <->]).
推荐阅读
- java - 为什么使用 proguard 混淆时调用不起作用
- c++ - 为什么我收到分段错误错误?
- reactjs - 使用 React 通过实时数据库进行映射
- python - 为什么 Pytesseract 不能识别这张图片中的任何字母?
- algorithm - 一个子调用为 n/2 的递归函数的 Big Oh 表示法是什么?
- sql-server - SQL-server 'WEEKDAY' 不是可识别的内置函数名称
- express - 头盔阻挡引导
- angular - BehaviourSubject 未更新 html 模板 Ionic 5
- python - 如何训练多输出 Seq2Seq keras 模型以联合预测序列及其相关分数
- settings - “任何人”选项未显示在设置共享名称和消息中的照片?