如何在 prolog 中定义运算符来创建列表?

问题描述 投票:0回答:4

我想以某种方式定义一个运算符“++>”,以便输入“a ++> b”将生成一个 [a,b] 列表。

我编写了以下代码,但它似乎没有完成这项工作。

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

:- op(500,xfy,++>).
list operators prolog
4个回答
0
投票
:- op(500,xfy,++>).
++>(X,Y,[X,Y]).

并像这样使用它

?- ++>(1,2,X).
X = [1, 2].

实际上,Prolog 不是面向计算的,所以运算符只是这些术语的同义词。 您需要一个术语,其中一个元素是另外两个元素的列表。因此,在这种情况下不能使用 2 位运算符。顺便说一句,在这种情况下你不能使用 is,因为它仅在算术情况下使用。


0
投票

这对你有用吗:

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

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

0
投票

[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

0
投票

输入“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].

让它扩展到你需要的任何地方(几年前编辑过)并且只在那些地方,可能会更困难。

© www.soinside.com 2019 - 2024. All rights reserved.