use*_*393 6 operators prolog swi-prolog
我试图在Prolog中编码基本的逻辑推理,我想定义一些自定义运算符来简化表示法.如果我能|-为⊢ 打字,那将会很方便.所以我试过了
:- op(1150, xfy, [ '|-' ]).
gamma |- a.
Gamma |- or(A,_) :- Gamma |- A.
Gamma |- or(_,A) :- Gamma |- A.
Run Code Online (Sandbox Code Playgroud)
但是当我尝试查询时gamma |- or(a,X),我收到错误消息
ERROR: '<meta-call>'/1: Undefined procedure: gamma/0
而不是true我期望的.
问题似乎是定义的运算符包括垂直条形字符.如果我将知识库修改为
:- op(1150, xfy, [ imp ]).
gamma imp a.
Gamma imp or(A,_) :- Gamma imp A.
Gamma imp or(_,A) :- Gamma imp A.
Run Code Online (Sandbox Code Playgroud)
然后Prolog在回答查询时没有问题gamma imp or(a,X).垂直条是保留字符,我不允许在定义中使用吗?或者有什么方法可以解决这个问题?
小智 7
也许,只是也许,您可以使用符号本身?使用u22A2,我可以输入以下源文件:
:-op(1150, xfy, ?).
gamma ? a.
Gamma ? or(A,_) :- Gamma ? A.
Gamma ? or(_,A) :- Gamma ? A.
Run Code Online (Sandbox Code Playgroud)
我可以毫无问题地加载它并查询它:
?- gamma ? or(a,X).
true ;
X = a ;
X = or(a, _2484) . % and so on
Run Code Online (Sandbox Code Playgroud)
我意识到这不是你要问的,我也意识到只有你能找到一种在文本编辑器和顶层输入这些字符的简单方法,这才有用.
你不可以做这个。ISO Prolog 和 SWI 中都没有。虽然竖线充当运算符 \xe2\x80\x94(如果存在相应的运算符声明),但它不能不加引号地用作长度为两个或更多字符的运算符的一部分。根据您的情况,最好的方法是声明一个运算符|-并以引用的形式使用它。在下面的两种情况下,都严格需要引用。
:- op(1200, xfx, '|-'). \n\na '|-' b.\nRun Code Online (Sandbox Code Playgroud)\n看起来不太吸引人。单独地,作为单个字符,条充当中缀运算符。
\n?- ( a | b ) = '|'(a, b).\n true.\n\n?- current_op(Pri,Fix,'|').\n Pri = 1105, Fix = xfy.\nRun Code Online (Sandbox Code Playgroud)\n列表中还有另一种用途,|用作头尾分隔符。[A|As]由于中缀栏可以采取的优先级的限制,因此和 以上使用之间没有歧义。
请注意,这[a|-].是有效的 Prolog 文本。Evengamma |- a.在 SWI 中有效,甚至在 ISO 中有效 Prolog 文本,前提是有操作员声明!
?- write_canonical((gamma|-a)).\n'|'(gamma,-(a))\nRun Code Online (Sandbox Code Playgroud)\n