Проблема с манипуляциями с Прологом

Я использую 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).
Другие вопросы по тегам