Пролог превращение аргументов в список - PullRequest
1 голос
/ 20 ноября 2011

Если бы у меня был предикат cat(dog(cow(a,b,c))), как я могу преобразовать это в cat(dog(cow([a,b,c])))?Я думал о предикате системы =.., но он не заканчивается должным образом, потому что я получаю cat([dog([cow([a,b,c])])]), и это не то, что я хочу :( Патч должен исправить и другой аналогичный случай, как dog(cat(a,b,c)) в dog(cat([a,b,c])).

У кого-нибудь есть идея? Или, может, я что-то не так делаю с операторами ...

Моя идея такова:

animal(X) :- atomic(X).
animal(X) :- atomic([]).

cow(X) :-
   animal(X),
   cow([X|List]).

dog(X) :-
   animal(X),
   dog([X|List]).

cat(X) :-
   animal(X),
   cat([X|List]).

Спасибо всем

1 Ответ

3 голосов
/ 20 ноября 2011

Используйте =.. с проверкой на троичные функторы.

ternary_takes_list(T0, T) :-
    (T0 =.. [F, X, Y, Z] ->
        T =.. [F, [X, Y, Z]]
    ; T0 =.. [F, X0] -> 
        ternary_takes_list(X0, X),
        T =.. [F, X]
    ;
        T = T0
    ).

Это работает на ваших примерах:

?- ternary_takes_list(cat(dog(cow(a,b,c))), X).
X = cat(dog(cow([a, b, c]))).

?- ternary_takes_list(dog(cat(a,b,c)), X).
X = dog(cat([a, b, c])).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...