2012-04-03 2 views
1

в основном то, что мне удалось сделать, это создать список кортежей в форме A = [[1,2,3],[1,2,12],[1,2,5]] с использованием факта makelist(A).Создайте список кортежей, основанный на том, что данный элемент другого списка

Теперь я хочу использовать это для создания другого списка, где он содержит только те корсеты, которые являются истинными для данного факта.

Например, у меня есть тест, который возвращает true, если число является простым prime(N) (которое принимает число и возвращает true, если оно является простым), я хочу использовать это, чтобы сохранить только третьи элементы в A, которые являются первичными. Итак, A = [[1,2,3],[1,2,5]]

Я попытался использовать predsort, но это, похоже, не работает только на одном элементе. Я думал, что это можно сделать, используя exclude, но я не могу заставить его работать.

Спасибо за любую помощь, которую вы можете мне дать.

ответ

1

С lambda.pl, вы могли бы написать:

:- [lambda]. 
filter_third_prime(Lists, Result) :- 
    include(\[_, _, X|_]^prime(X), Lists, Result). 

Без него можно было бы написать:

filter_third_prime2(Lists, Result) :- 
    include(third_is_prime, Lists, Result). 
third_is_prime([_, _, X|_]) :- 
    prime(X). 

Кстати, вы упоминалось, используя exclude/3: эти решения совершенно одинаковые из них, используя его, только они используют свой двойной предикат, include/3.

+0

спасибо, что второй действительно помог !!! – user1310221

+0

@ user1310221: добро пожаловать. Кстати, если вы привыкли к функциональным идиомам программирования, таким как фильтр и карта, я бы действительно посоветовал вам взглянуть на библиотеку lambda, с которой я связан, это сделает вашу жизнь намного легче, чем это стоит изучать. – m09

0
% Assumes notPrime(N) is true iff N isn't prime 
thirdPrimes([],[]). 
thirdPrimes([A|B],[A|BP]) :- A=[_,_,N|_],prime(N),thirdPrimes(B,BP). 
thirdPrimes([[_,_,N|_]|B],BP) :- notPrime(N),thirdPrimes(B,BP). 

 Смежные вопросы

  • Нет связанных вопросов^_^