سؤال

أنا أعمل حاليا على مشروع قصير على حاسوب فقط متورطون في محاولة تطبيق "تصفية" لقد خلق إلى قائمة.لدي ما يمكن أن تسميه مرشح جاهزة, ولكن أنا لا يمكن تطبيقه.سيكون من الأفضل إذا كنت توضح:

filter(A, B) 

...النواتج 'true' إذا تم استيفاء شروط معينة.

filterList(A, [X, Y, Z])

...إخراج القائمة التي تشمل جميع العناصر من الحجة الثانية التي تجعل تصفية الإخراج كاذبة.(حتى إذا تصفية(أ ، س) صحيح ، والناتج هو [Y, Z] ).

علي "تصفية" وظيفة جاهزة, ولكن الآن أنا بحاجة إلى تطبيقه على قائمة كما هو موضح في المثال الثاني ، باستثناء جميع العناصر التي فلتر ترجع صحيح عند تطبيقها مع أول حجة.

لذلك ، إذا كان المرشح هو بسيط A == B ، وظيفة من المفترض أن يتلقى [A ، B ، A ، C ، D ، A] وإخراج [B ، C ، D], بعد إزالة جميع العناصر التي المرشح الواضح.

أواجه مشكلة مع الهيكل الأساسي من وظيفة ، حتى إذا كان أي شخص يمكن أن توفر مخطط أساسي وظيفة مثل هذا سيكون عونا كبيرا.لقد مبسطة وضعي قدر الإمكان حتى أستطيع أن أخذ ما كنت قد تكون قادرة على توفير وتعديله لاحتياجاتي.

شكرا مقدما!

هل كانت مفيدة؟

المحلول

إذا كنت تبحث عن الوظائف العليا في حاسوب ، يجب عليك استشارة بالتأكيد Naish (1995), مورد جيد جدا على هذا.

له تعريف filter/3 هو ما يلي (انه يستخدم الفرق-قائمة الرموز ، ولذلك يهرب الحاجة إلى تحديد filter/4):


filter(_,[],[]).
filter(P, A0-As0, As) :-
    (
        call(P, A0) -> As = A0-As1
    ;
        As = As1
    )
    , filter(P, As0, As1).

لقد لديك أسئلة حول هذا المسند ، يرجى طلب لي في التعليق.قراءة ورقة ينصح بشدة أيضا ، كما definess map, foldr و compose!نلاحظ أن العديد من القيود يذكر (مثل على سبيل المثال في عداد المفقودين call/3 أو العليا apply لا تنطبق الآن.SWI-Prolog لديه =.. المشغل الذي يعالج كل مخاوفه و يجعل التعسفي ن النظام المنطق ممكن.

نصائح أخرى

SWI-Prolog يقدم exclude/3 وغيرها من مثل هذه الفوقية المسندات.الأصلي المشكلة يمكن أن تكون مشفرة مثل هذا:

are_identical(X, Y) :-
    X == Y.

filterList(A, In, Out) :-
    exclude(are_identical(A), In, Out).

استخدام على سبيل المثال:

?- filterList(A, [A, B, A, C, D, A], Out).
Out = [B, C, D].

هناك مشكلة متأصلة مع فلتر الوظائف التي تأخذ نجاح أو فشل التقييم حسب معيار الترشيح:مما أدى البرنامج لم يعد محض رتيب البرنامج.ولذلك يفقد كل التعريفي خصائص — المعنى الوحيد الذي يبقى هو إجرائي خطوة بخطوة التفسير.هنا هو محض, تتحقق نسخة من تصفية باستخدام if_/3:

tfilter(_CT_2,    [], []).
tfilter(CT_2, [E|Es], Fs0) :-
   if_(call(CT_2,E), Fs0 = [E|Fs], Fs0 = Fs ),
   tfilter(CT_2, Es, Fs).

الحجة الأولى هي بالتالي إغلاق/استمرار ذلك سوف تتلقى المزيد من الحجج:العنصر الناتج القيمة الحقيقة.

=(X,X,true).
=(X,Y,false) :- dif(X,Y).

الآن, لا تزال نتائج دقيقة:

| ?- tfilter(=(X),[A,B],Xs).
B = A,
X = A,
Xs = [A,A] ? ;
X = A,
Xs = [A],
dif(A,B) ? ;
X = B,
Xs = [B],
dif(B,A) ? ;
Xs = [],
dif(X,A),
dif(X,B) ? ;
no

هناك أربعة احتمالات كيفية قائمة من عنصرين يمكن تصفيتها حسب معيار يجري على قدم المساواة X.كل عنصر قد تكون متساوية أو قد تكون مختلفة.

الجانب السلبي لهذا النهج هو أن على المرء أن توفر تتحقق الإصدارات من جميع المعايير.

حسنا ما عرفت أنا فقط اكتشفت ذلك.لذا أنا هنا تقديم إجابة على سؤالي ، كما هو متوقع حقا قصيرة وظيفة العمل:

filterList(_,[],R,R).           % Returns answer when the list is exhausted.
filterList(L,[A|List],Temp,Res) :-
   filterList(L,List,New,Res),  % Recursive call, New is either the same list
   (  filter(L,A),              % in case the filter outputs true, or the list
      New = Temp
   ;  New = [A|Temp]            % plus the current element otherwise.
   ).

أحصل على البالغين البلد // Obtengo لوس الفسيفساء الكبار de un pais, بلد = بايس الناس = اشخاصا شخص = una sola شخصية

habitants(USA, [juan, pedro, david])

adults(Adults, Country) :-
     findall(Person, (habitants(Country,People), member(People, Person), adult(Person)), Adults)

هذا هو مرشح في حاسوب // عاصي es un تصفية ar prolog

filter(_,[],[]).
filter(Predicate,[First|Rest],[First|Tail]) :-
   filter(Predicate,Rest,Tail).
filter(Predicate,[_|Rest],Result) :-
   filter(Predicate,Rest,Result).
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top