Я не совсем понимаю вашу проблему с =..
, но у меня это сработало:
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.