2013-02-21 1 views
0

Я парень C++, и я совершенно новичок в прологе. Я использую sicstus prolog.фильтровать диапазон, используя хеш-вид списка

я наткнулся на необходимость, как показано ниже:

позволяет сказать, у меня есть переменная

A={0,1,2,3} 
B={-2,-1,0,1,2,3,4,5} 

и у меня есть хэш такие вещи, как

0-{3} 
1-{4} 

Теперь мне нужно фильтровать значения A и B с использованием этого хеша, чтобы после операции:

A={0,1} 
B={3,4} 

логика - это значения из A будут сопоставлены с ключами хеша

Если ключ существует, то проверьте значение. Если значение существует в B, тогда значение в A остается. иначе значение должно быть удалено. таким же образом, это должно быть сделано для B со значениями хэш Шоул DBE искали в А и если нет, то он должен быть удален в B. означает точно противоположный путь В.

Может кто-нибудь пожалуйста Помогите?

ответ

1

Я предлагаю вам использовать списки для хранения ключей и значений A и B и список из Key-Value пар для хранения вашей хэш-карты. Таким образом, вы можете использовать встроенные вспомогательные предикаты include/3 и memberchk/2 в соответствии с вашими потребностями.

Затем вы можете написать процедуру, которая фильтрует пункты A и B:

filter(A, B, Hash, FA, FB):- 
    include(filterkey(B, Hash), A, FA), 
    include(filtervalue(A, Hash), B, FB). 

filterkey(B, Hash, Item):- 
    memberchk(Item-Value, Hash), 
    memberchk(Value, B). 

filtervalue(A, Hash, Value):- 
    memberchk(Item-Value, Hash), 
    memberchk(Item, A). 

Скажем, если у вас есть

A=[0,1,2,3] 
B=[-2,-1,0,1,2,3,4,5] 
Hash=[0-3, 1-4] 

затем:

?- A=[0,1,2,3], B=[-2,-1,0,1,2,3,4,5], Hash=[0-3, 1-4], filter(A, B,Hash, FA, FB). 
Hash = [0-3, 1-4], 
FA = [0, 1], 
FB = [3, 4]. 
0

Я сожалею У меня нет Sicstus для тестирования, и тогда я могу быть полностью внедорожником, но вы обрабатываете очень Особый вид переменных. Рассмотрим

?- write_canonical({1,2,3,4}). 
{}(','(1,','(2,','(3,4)))) 

?- {1,2,3,4}={A}. 
A = (1, 2, 3, 4). 

Скобы действительно просто своеобразное название для кортежа, и AFAIK используются только в качестве синтаксического устройства для введения считываемые данные в DSL (Domain Specific Language), как, например, ограничений в библиотеке (clpqr).

То, что я имею в виду, что или

  • вы используете неправильное представление для выполнения этой задачи (gusbro решать эту проблему, +1)
  • вы ищете расширение ограничений ClP (фильтрации?) недоступны в Сикстусе. Но тогда вопрос должен быть переформулирован в лучших терминах.

В любом случае вы могли бы адаптировать gusbro»ответ без изменения вашей программы, если добавить, например,

member_set(E, {','(E,_)}). 
member_set(E, {','(_,T)}) :- member_set(E, {T}). 
member_set(E, {E}). 

заменить memberchk. include/3 также должны быть переписаны, но это не так просто. В противном случае предикат преобразования

set_list({','(A,B)}, [A|R]) :- set_list({B}, R), !. 
set_list({E}, [E]). 
set_list({}, []). 

может быть удобно:

?- set_list(S,[1,2,3]). 
S = {1, 2, 3}. 

?- set_list({1,2,3},L). 
L = [1, 2, 3]. 
Смежные вопросы