2012-04-24 13 views
1

に次々順1である場合、私は、私は最初の原子が第二の前にあるかどうかを確認しますその機能を確認し実行する必要があり、リストCLISP:二つの要素がリスト

L=(1 j 3 k 4 h 5 n 6 w) 

を持って確認してください。私はこれを確認したい :

> Verify(3 k) 

結果を返す必要があります

原子が '3' アトム 'K'

前に、この場合にはある//ので

> T 

>Verify(h 4) 

結果は返されます。

> NIL 

//アトム「h」はアトムの後に「4」

あるので、私はあなたが使用しているのLispのどの方言位置に

+0

この質問の構文は、Lispのようには見えません。あなたはどの通訳を使っていますか? –

+0

@ÓscarLópezこれはLISPの構文ではありません。私は何をしたいのかを説明するのに使った擬似コードです。 – Alex

+0

良いです。私の答えでは、私はそれを中立に保つようにしました。コメントの兆候に従ってください。あなた自身で解決策を見つけることができるはずです。申し訳ありませんが、私はあなたにまっすぐな答えを与えることはできませんが、それは宿題です... –

答えて

2

の各要素の位置を確認し、比較することがありますか?ここでフィルインの空白、解決策を導出する方法についていくつかのポインタです:

(define (verify lst a b) 
     ; what happens if there's only one element left in the list? 
    (cond ((null? (cdr lst)) <???>) 
     ; how do we check if the current element is equal to the `a` parameter 
     ; and the next element is equal to the `b` parameter? 
     (<???> T) 
     ; how do we continue traversing the rest of the list? 
     (else (verify <???> a b)))) 

;;; tests 

(define lst '(1 j 3 k 4 h 5 n 6 w)) 

(verify lst 3 'k) 
> T 
(verify lst 'h '4) 
> F 
1

これは、Common Lispの中でワンライナーです:

(defun verify (list a b) 
    (member b (member a list))) 

は、それがTまたはNILを返しません、 「一般化されたブール値」(nil以外の値はすべてtrue)です。

http://clhs.lisp.se/Body/26_glo_g.htm#generalized_boolean

これはまた、「前」は「どこでも前に」を意味することを前提としています。これは、Lispの基本的な概念です。あなたの宿題の問題は、「直前」と思われるようです。変更するのは簡単でなければなりません。

+0

私が試したが、それはうまくいきませんでした (setqの一覧(関数定義(リストAB) (部材B(メンバーリスト))を確認してください) '(1つの3 AR 5 6 DY))を (一覧を確認してくださいR' 5) 結果:Break 24 [26]> (5 6 DY) – Alex

+0

'(5 6 DY)'は 'nil'と異なるオブジェクトであるため真の結果です。これは私が答えで参照する "一般化されたブール"の概念です。一般化されたbooelanは、例えば、あなたがこれを行うことができるということを意味します(if(verify t 'r 5)(format t "yes、真を証明しました!〜%")) '。 '(5 6 D Y)'オブジェクトは 'if'で真に扱われ、' format'が評価されます。これは、ブール値が多くのLispコードでどのように処理されるかです。あなたはそれらを厳密に 't'と' nil'に変換する努力を無駄にしています。 – Kaz

+0

一般化されたブール値を厳密に 't'と' nil'にすることができます。 'if'を' if(generalized-boolean-expression t) 'のように追加します。もし式が真であれば、 't'を生成する。(そうでなければ 'nil'を生成します:' if'に3番目の引数がない場合は暗黙的です)。 – Kaz

関連する問題