Простое исправление паттернов Prolog - PullRequest
0 голосов
/ 10 ноября 2010

Так что если у меня есть что-то вроде [(a,b,c,d)] и я хочу удалить () s (во всем списке будет только один набор скобок - сразу после '[' и перед ']'), какдавай мое правило: curly_for_square( [(C)], [C] ). не работает?Похоже, что так и должно быть, но я уверен, что есть простая причина !!

Ответы [ 2 ]

1 голос
/ 11 ноября 2010

Я не совсем уверен, что именно является [(a,b,c,d)], но я подозреваю, что оно эквивалентно [ ','(a, ','(b, ','(c, d))) ], с использованием оператора запятой infix три раза, поскольку нет функтора, принимающего эти четыре аргумента.

Если вам абсолютно необходимо использовать этот синтаксис, возможно, что-то подобное поможет преобразовать в обычный список:

decomma( List, [Head | TailOut] ) :- List = [','(Head,TailIn)], !,
    decomma( [TailIn], TailOut ).
decomma( [Term], [Term] ).
0 голосов
/ 11 ноября 2010

Для преобразования назад и вперед между [a, b, c, ...] и (... (((a, b), c) ...)

flatten(X, H, T) :- var(X), !, H = [X|T].
flatten((A,B), H, T) :- !,
 flatten(A, H, X),
 flatten(B, X, T).
flatten(X, [X|T], T).

unflatten([X], X) :- !.
unflatten([A,B|Cs], F) :- unflatten([(A,B)|Cs], F).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...