Пролог: Фильтр и список - PullRequest
       6

Пролог: Фильтр и список

0 голосов
/ 06 декабря 2018

Создайте предикат с именем fPairsAtoms / 3, чтобы для данного атома (первый аргумент) и списка пар объединяли третий параметр с отфильтрованным списком пар, выбирая только пары, у которых первый компонент имеет видатом первого аргумента.

Пример:

fPairsAtoms(sA,[[basA,absAb],[ab,bbsA],[sA,abbsB],[bsA,sAsB],[sA,bb]],X)  

Результат:

X = [[sA,abbsB],[sA,bb]]

Я не понимаю ..... Что я долженсталкиваются с этими типами упражнений?Можете ли вы помочь мне найти решение?

Сегодня я начал с пролога, я новичок во всех отношениях.

Ответы [ 2 ]

0 голосов
/ 06 декабря 2018

Чтобы отфильтровать пары в списке, вам нужно пройти , сравнивая данный атом с первым элементом каждой пары.Тривиальный предикат для обхода списка будет выглядеть так:

traverse([]).
traverse([Head| Tail]) :-
    traverse(Tail).

Предикат в описании вашей проблемы ужасно назван и не следует рекомендуемым рекомендациям по кодированию Prolog.Давайте переименуем его в filter_pairs_by_key/3 и изменим порядок аргументов на filter_pairs_by_key(Pairs, SearchKey, FilteredPairs).Кроме того, рекомендуемое представление для пары в Прологе - Key-Value.Существуют стандартные предикаты и библиотечные предикаты, которые ожидают этого представления (например, keysort/2).На основе шаблона предиката traverse/2 и рекомендаций по стилю кода мы можем написать:

filter_pairs_by_key([], _, []).
filter_pairs_by_key([Key-Value| Pairs], SearchKey, [Key-Value| FilteredPairs]) :-
     Key = SearchKey, 
     filter_pairs_by_key(Pairs, Atom, FilteredPairs).
filter_pairs_by_key([Key-_| Pairs], SearchKey, FilteredPairs) :-
     Key \= SearchKey, 
     filter_pairs_by_key(Pairs, SearchKey, FilteredPairs).

Обратите внимание, что я использую два предложения для непустого списка: одно, когда ключ пары соответствуетатом и один, когда совпадение не удается.

Пример вызова:

| ?- filter_pairs_by_key([basA-absAb,ab-bbsA,sA-abbsB,bsA-sAsB,sA-bb], sA, FilteredPairs).          

FilteredPairs = [sA-abbsB,sA-bb] ? 

yes

Больше можно сказать об этой проблеме и этом конкретном решении, но, как упоминалось в комментариях, это не новичкиупражнение.Примите во внимание рекомендации комментариев и после того, как вы освоитесь с нотацией списка Пролога, поиграйте с этим решением.

0 голосов
/ 06 декабря 2018

Если вы только начали сегодня, вам, вероятно, еще рано решать эту проблему.

Сначала вы должны понять, что такое термины Пролога: atoms, логический Variables, составные термины foo(x,X,bar(baz)).

Тогда вы должны понимать объединение, a = a, a = A, A = a, A = foo(a), foo(A) = foo(a), [atom, B] = [A, bar].

Вы должны понимать представление списков, где

[  A,   B,   C     ] 
= [A,   B | [C]    ] 
= [A | [B ,  C    ]] 
= [A | [B | [C]   ]] 
= .... 
= [A ,  B ,  C | []] 

, чтобы объединение [A | B] = [a] завершилось успешно , что также привело к объединению A = a и B = [], но объединению[A | B] = [] терпит неудачу .

Тогда вам нужно понять предикаты, которые в соответствии с процедурной интерпретацией означают,

to_prove(This) :- need_to_prove(This) , and_also(That).

Так что

fPairsAtoms(sA, [[basA,absAb],[ab,bbsA],[sA,abbsB],[bsA,sAsB],[sA,bb]], X) :-
            X = [                       [sA,abbsB],           [sA,bb]].

- совершенно правильное, хотя и чрезвычайно узкое, определение единицы.

Но так же, как и

fPairsAtoms(sA, [[basA,absAb],[ab,bbsA],[sA,abbsB] | [[bsA,sAsB],[sA,bb]] ], X) :-
            X = [                       [sA,abbsB] | [           [sA,bb]] ].
% and 
fPairsAtoms(sA, [             [ab,bbsA],[sA,abbsB] | [[bsA,sAsB],[sA,bb]] ], X) :-
            X = [                       [sA,abbsB] | [           [sA,bb]] ].
% and 
fPairsAtoms(sA, [                       [sA,abbsB] | [[bsA,sAsB],[sA,bb]] ], X) :-
            X = [                       [sA,abbsB] | [           [sA,bb]] ].
% and 
fPairsAtoms(sA,                                      [[bsA,sAsB],[sA,bb]]  , Y) :-
            Y =                                      [           [sA,bb]].
% ... and 
fPairsAtoms(sA,                                                        []  , Y) :-
            Y =                                                        [].

, а также

fPairsAtoms(sA, [                       [sA,abbsB] | L                    ], X) :- 
            L =                                      [[bsA,sAsB],[sA,bb]], 
            Y =                                      [           [sA,bb]],
            X = [                       [sA,abbsB] | Y                    ].

и, таким образом,

fPairsAtoms(sA, [                       [sA,abbsB] | L                    ], X) :- 
            L =                                      [[bsA,sAsB],[sA,bb]], 
            fPairsAtoms( L, Y),
            Y =                                      [           [sA,bb]],
            X = [                       [sA,abbsB] | Y                    ].
% and
fPairsAtoms(sA, [                       [sA,abbsB] | L                    ], X) :-
            L =                                      [[bsA,sAsB],[sA,bb]], 
            fPairsAtoms( L, Y),
            X = [                       [sA,abbsB] | Y                    ].
% and
fPairsAtoms(sA, [                       [sA,abbsB] | L                    ], X) :-
            fPairsAtoms( L, Y),
            X = [                       [sA,abbsB] | Y                    ].
% and so
fPairsAtoms(sA, [                       A          | L                    ], X) :-
            A =                         [sA, B   ],
            fPairsAtoms( L, Y),
            X = [                       A          | Y                    ].
% and even
fPairsAtoms(SA, [                       A          | L                    ], X) :-
            A =                         [SA, B   ],
            fPairsAtoms( SA, L, Y),
            X = [                       A          | Y                    ].

Но с другой стороны, в случаях, когда не было совпадения, мы увидели, что это

fPairsAtoms(SA, [                       A          | L                    ], X) :-
            A =                         [SB, B   ],
            dif( SA, SB),
            fPairsAtoms( SA, L, Y),
            X =                                      Y                     .
% i.e.
fPairsAtoms(SA, [                       [SB, B   ] | L                    ], X) :-
            dif( SA, SB),
            fPairsAtoms( SA, L,                      X)                    .

Итак, какой из двух пунктов мыв конечном итоге,

fPairsAtoms( SA, [ [SA, _] | L ], X) :-
            fPairsAtoms( SA, L, Y),
            X = [A |            Y].

fPairsAtoms( SA, [ [SB, _] | L ], X) :-
            dif( SA, SB),
            fPairsAtoms( SA, L,   X).

является правильным?Ответ: оба!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...