Как вы определяете оператор в прологе, чтобы составить список? - PullRequest
5 голосов
/ 18 января 2011

Я хочу определить оператор "++>" таким образом, чтобы при наборе "a ++> b" был получен список [a, b].

Я написал следующий код, но, похоже, он не справляется с работой.

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

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

Ответы [ 3 ]

0 голосов
/ 29 января 2013

Работает ли это для вас:

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

:- op(500,xfy,++>).
0 голосов
/ 26 мая 2016

[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 голосов
/ 18 января 2011
:- op(500,xfy,++>).
++>(X,Y,[X,Y]).

И используйте его как

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

На самом деле, Пролог не ориентированные вычисления, поэтому операторы - это просто синонимы терминам.Вы хотите термин \ 3, где один элемент является списком двух других.Таким образом, вы не можете использовать 2-позиционный оператор в этом случае.Кстати, вы не можете использовать is в этой ситуации, потому что он используется только в арифметических случаях.

...