List 如何在prolog中定义一个操作符来创建一个列表?

List 如何在prolog中定义一个操作符来创建一个列表?,list,operators,prolog,List,Operators,Prolog,我想定义一个操作符“++>”,这样键入“a++>b”将生成一个[a,b]的列表 我已经编写了以下代码,但它似乎无法完成这项工作 ++>(X,Y) :- [X,Y]. :- op(500,xfy,++>). 像这样使用它 ?- ++>(1,2,X). X = [1, 2]. 实际上,Prolog不是面向计算的,所以操作符只是术语的同义词。 您需要一个术语\3,其中一个元素是另两个元素的列表。因此,在这种情况下不能使用2位运算符。顺便说一句,在这种情况下,您不能使用is,因

我想定义一个操作符“++>”,这样键入“a++>b”将生成一个[a,b]的列表

我已经编写了以下代码,但它似乎无法完成这项工作

++>(X,Y) :-
 [X,Y].

:- op(500,xfy,++>).
像这样使用它

?- ++>(1,2,X).
X = [1, 2].
实际上,Prolog不是面向计算的,所以操作符只是术语的同义词。
您需要一个术语\3,其中一个元素是另两个元素的列表。因此,在这种情况下不能使用2位运算符。顺便说一句,在这种情况下,您不能使用is,因为它只在算术情况下使用。

这对您有用吗:

++>((X,Y),Z) :-Z= [X,Y].

:- op(500,xfy,++>).

[a,b,c]
只是
'(a,'(b,'。(c))
的语法糖。因此,您可以同样定义运算符并编写转换谓词:

:- op(500,xfy,'++>').

convert('++>'(A,B),[A|R]) :-
    convert(B,R).
convert(Any,[Any]).
例如:

| ?- X = 1++>2++>3, convert(X,Y).                                    
X = 1++>2++>3
Y = [1,2,3] ?
yes

在您的示例中声明运算符是没有用的。您声明了2参数运算符(+>/2),但右定义了3参数谓词(+>/3),然后我们来声明一些3place运算符这里确实有两个问题,将运算符“++>”定义为infix表示法,并安排表达式“a++>b”将被“求值”为术语[a,b]。这篇文章的第一部分是相当标准的序言,正如您在提到op/3时所知道的。让机器就位以“评估”涉及新操作员的术语更为棘手。对于算术函数,SWI Prolog有一个指令,允许is/2使用用户定义的函数,但您的指令不是算术函数。我可以向您展示如何定义一个新的谓词iz/2,它将“计算”++>术语。我有机会去挖掘SWI Prolog的
算术函数/1
指令,我注意到它已经被删除了。
| ?- X = 1++>2++>3, convert(X,Y).                                    
X = 1++>2++>3
Y = [1,2,3] ?
yes