Обычно переменные в цели и переменные в заголовке предложения сопоставляются по их позициям, а не по именам.Таким образом, вызов ?- sendmore0([S,E,N,D,M]).
должен быть реализован следующим образом:
sendmore0([S,E,N,D,M]) :- sendmore([S,E,N,D,M,_,_,_]).
Однако это будет означать, что вам потребуется реализовать это для каждой возможной комбинации.Вы описываете, тогда вам нужно дать переменные стабильные имена.В ECLiPSe вы можете сделать это с библиотекой var_name
.Хотя это довольно взломано ...
:- lib(var_name).
sendmore0(L) :-
build_arg(["S","E","N","D","M',"O","R","Y"], L, A),
sendmore(A).
build_arg([], _, []) :- !.
build_arg([H|T], L, [HA|HT]) :-
match_arg(L, H, HA),
build_arg(T, L, HT).
match_arg([], _, _). % or use 0 as last argument if you want
match_arg([H|T], Base, A) :-
(
get_var_name(H, S),
split_string(S,"#","",[Base,_])
->
A = H
;
match_arg(T, Base, A)
).
Тогда вы можете вызвать sendmore0/1
с более коротким списком переменных.Не забудьте установить имена переменных!
?- set_var_name(S, "S"), set_var_name(E, "E"), sendmore0([S, E]).
S = 9
E = 5
Yes (0.00s cpu, solution 1, maybe more)
Отказ от ответственности : это , а не , для чего нужны стабильные имена.Они предназначены для отладки.Если Иоахим когда-нибудь увидит это, он даст мне острый зажим по ушам ...