Проблема с манипуляциями с Прологом
Я использую SWI пролог и мой код, как это. Я читаю предикат данных из файла, и его счетчик арности может измениться. Как я могу обобщить это. Например, если данные (a1,b1,c1) записываются в файл, как я могу найти решение? Есть ли у вас какие-либо идеи?
> basla:-consult('test.pl'),
> answer(L1,L2,L3,L4,L5),
> list_to_set(L1, X),
>
> write(X).
> answer(L1,L2,L3,L4,L5):-
> findall(First, data(First,_,_,_,_),L1),
> findall(Second, data(_,Second,_,_,_),L2),
> findall(Third, data(_,_,Third,_,_),L3).
3 ответа
Если арность предиката, кажется, изменяется, почти всегда лучше сделать его арным и дать ему аргумент списка. Ваш findall
запросы могут быть расширены с помощью вызова nth1
или же nth0
,
Базла (Предикат / Арити):- консультации ('test.pl'), Длина (L,Arity), для (1,N-й, Arity), FindAll(А,( nth1(N-й,L, А), P =.. [Предикат |L], называть (Р)), LX), list_to_set(LX,U) writef('% т \ п',[LX]), Nth = Arity.
basla(Predicate/Arity) :-
consult('test.pl'),
length(L,Arity),
for(1,Nth,Arity),
findall(A,(
nth1(Nth,L,A),
P =.. [Predicate|L],
call(P)),
LX),
list_to_set(LX,U),
writef('%t\n',[U]),
Nth = Arity.
for(B,C,A) :-
A >= B,
for_2(B,C,A).
for(B,C,A) :-
A B,!,
fail.
for_2(A,A,_).
for_2(A,C,D) :-
B is A + 1,
for_2(B,C,D).