Преобразовать список в параметр функтора - PullRequest
2 голосов
/ 19 февраля 2011

Я застрял, чтобы реализовать логику.В какой-то момент в моей программе есть список с именем List.Длина этого списка является переменной, и я не знаю заранее.Теперь я должен передать этот список в функторе, чтобы создать факт, и я не могу его реализовать.Например:

, если List равен [first], тогда следует добавить факт functor(first).
, если List равен [first,second], тогда следует добавить факт functor(first,second).
, если List равен [first,second,third] тогда следует добавить факт functor(first,second,third).
и так далее ...

Я пытался =.., но здесь я не могу отобразить это ограничение переменной длины.Для фиксированной длины я могу выполнить, но я не знаю заранее, сколько элементов будет в списке.

Любые предложения по реализации этой логики.Спасибо.

1 Ответ

5 голосов
/ 19 февраля 2011

Я не совсем понимаю вашу проблему с =.., но у меня это сработало:

 assert_list(List) :-
            Term =.. [my_functor|List],
            assert(Term).

Обратите внимание, что я использую my_functor вместо простого functor, потому что functor/3 является встроенным предикатом, поэтому вы не можете утверждать троичные functor факты (functor(first, second, third)).

Называя это:

 ?- assert_list([first,second,third]).
 true.

Проверка работоспособности:

 ?- listing(my_functor).
 :- dynamic user:my_functor/3.

 user:my_functor(first, second, third).

 true.

Обратите внимание, что технически разные n-арные my_functor/n предикаты не являются одинаковыми предикатами. Вы должны использовать разные запросы в вашей программе для каждого n. Чтобы обойти это, вы можете просто утвердить список как один-единственный аргумент my_functor:

 ?- List = [first, second, third],
 assert(my_functor(List)).
 true.

 ?- listing(my_functor).
 :- dynamic user:my_functor/3.

 user:my_functor([first, second, third]).

 true.

Моя версия SWI-Prolog 5.7.5.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...