2015-11-07 2 views
0

У меня есть файл с именем dictionary.lisp. Это включает некоторые слова, такие какнайти список в другом списке

(defparameter *dictionary* '(
        (a b a) 
        (a b a d i) 
. 
. 
) 

Я пытаюсь найти их в виде списка. Я пробовал следующие операции

[5]> (find '((a b a d i)) *dictionary* :test 'equal ) 
NIL 
[6]> (find '((a b a d i)) *dictionary* :test #'equalp ) 
NIL 
[7]> (member '((a b a d i)) *dictionary* :test 'equal ) 
NIL 
[8]> (member '((a b a d i)) *dictionary* :test #'equalp ) 
NIL 
[9]> (find '((a b a d i)) *dictionary* :test #'subsetp ) 
NIL 

Есть ли какая-либо функция lisp, которая может возвращать non-nil?

+1

Вы ищете неправильную вещь. Не '(find '((abadi)) ...)', do '(find' (abadi) ...)' с равным или равным тестом (который вы делаете правильно в первых четырех примерах) , –

+0

Каков ваш совет? как я могу получить ожидаемый результат? @JoshuaTaylor –

+1

Думаю, я написал это довольно четко в этом комментарии. В списке есть список (a b a d i), который представляет собой список из пяти символов и ((a b a d i)), который представляет собой список из одного списка, содержащего пять символов. Ваш словарь содержит (a b a d i), но он не содержит ((a b a d i)). В ответе я привел правильный пример. –

ответ

3

Вы должны использовать равно или EQUALP в качестве теста, который вы делаете в четырех из ваших примеров. Вам также нужно искать что-то, что действительно находится в списке. Например, словарь, который вы описали, содержит список из пяти символов (abadi) в качестве элемента, но не список ((abadi)) (который представляет собой список, содержащий один элемент, и этот элемент представляет собой список из пяти символов). Это означает, что вы могли бы сделать (найти '(A B A d I) & hellip;: тест' равно):

CL-USER> (defparameter *dictionary* '((a b a) 
             (a b a d i))) 
*DICTIONARY* 
CL-USER> (find '((a b a d i)) *dictionary* :test 'equal) 
NIL 
CL-USER> (find '(a b a d i) *dictionary* :test 'equal) 
(A B A D I) 
CL-USER> (find '(f o o) *dictionary* :test 'equal) 
NIL 
+0

Я проверял его, конечно, моя цель - найти это ((a b a d i)), но спасибо за вашу помощь –

+1

@hax хорошо, найдите сравнение элемента с элементами theach в списке. Вы можете добавить ': key 'list' и получить результаты, которые вы ищете. –

1
CL-USER 25 > (defparameter *dictionary* '((a b a) (a b a d i))) 
*DICTIONARY* 

CL-USER 26 > (defun my-find (list0 list1) 
       (and (find (first list0) list1 :test #'equal) 
        t)) 
MY-FIND 

CL-USER 27 > (my-find '((a b a d i)) *dictionary*) 
T 

Это просто не выглядит, как он будет делать много смысла.

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