Проблема с манипуляциями с Прологом - PullRequest
0 голосов
/ 11 мая 2011

Я использую 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 ]

1 голос
/ 11 мая 2011

Если кажется, что арность предиката меняется, почти всегда лучше сделать его арным и задать аргумент списка. Ваши findall запросы могут быть расширены с помощью вызова на nth1 или nth0.

0 голосов
/ 11 мая 2011

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',[LX]),
        Nth = Arity.        

0 голосов
/ 11 мая 2011

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).
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...