我想以某种方式定义一个运算符“++>”,以便输入“a ++> b”将生成一个 [a,b] 列表。
我编写了以下代码,但它似乎没有完成这项工作。
++>(X,Y) :-
[X,Y].
:- op(500,xfy,++>).
:- op(500,xfy,++>).
++>(X,Y,[X,Y]).
并像这样使用它
?- ++>(1,2,X).
X = [1, 2].
实际上,Prolog 不是面向计算的,所以运算符只是这些术语的同义词。 您需要一个术语,其中一个元素是另外两个元素的列表。因此,在这种情况下不能使用 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
输入“a ++> b”将生成 [a,b] 列表。
问题是“列出 [a,b]”并将其放在哪里?您的代码可能会在内存中创建一个 [X,Y] 列表,确认可以创建该列表,然后丢弃它 - 因为没有地方可以放置它。
你问的更像是问
++>
是两个项目列表的另一种语法,这是一个宏或术语扩展任务,例如
:- op(500,xfy,++>).
goal_expansion(=(X,'++>'(A,B)), =(X,[A,B])).
然后:
?- Ls = a ++> b.
Ls = [a, b].
让它扩展到你需要的任何地方(几年前编辑过)并且只在那些地方,可能会更困难。