Это не адреса памяти.Это свободные переменные.То, что вы видите, это их внутренние имена в выбранной вами прологической системе.Тогда, как указал @chac (+1 между прочим), третье предложение не имеет смысла!Возможно, вы можете попытаться рассказать нам, что вы имели в виду, чтобы мы могли пролить свет на то, как это правильно сделать.
Я собираюсь дать вам две реализации вашего предиката, чтобы попытаться показать вам правильный синтаксис Prolog:
duple1(N, X, L) :-
length(L, N),
maplist(=(X), L).
Здесь, в вашем предикате duple1/3
, мы говорим прологу, что длина результирующего списка L
равна N
, и затем мы говорим ему, что каждый элемент L
должен бытьобъединяется с X
для предиката для хранения.
Еще один способ сделать это - создать результирующий список "вручную" с помощью рекурсии:
duple2(0, _X, []).
duple2(N, X, [X|L]) :-
N > 0,
NewN is N - 1,
duple1(NewN, X, L).
Хотя, обратите внимание, потому что мы используем>/2
, is
и -/2
, то есть арифметика, мы запрещаем прологу использовать этот предикат несколькими способами, такими как:
?- duple1(X, Y, [xyz, xyz]).
X = 2,
Y = xyz.
Это работало раньше, в нашем первом предикате!
Надеюсь, это помогло.