2016-12-19 5 views
1

文字列が実行可能な作業呼び出しかどうかを確認しようとしています。これを行うには、文字列を解析して最初の単語を取得し、それが事前定義された関数のデータベースと一致する場合、それは成功するはずです。 Qには文字列があり、Aは後で使用されますが、今は使用されません。文字列の例は:append aとbです。Prologメンバ関数は正常に動作するはずですが、

is_uni(Q, A):- 
    split_string(Q, " ", ",", [X|Y]), 
    uni_db(Z), 
    member(X, Z). 

uni_db([ 
    append, 
    member, 
    append1 
    ]). 

答えて

0

あなたは一例では、あなたが動作するためにappend"append"を変換する必要があり、原子に刺さを変換するatom_codes/2述語を使用する必要があります。

is_uni(Q,A):- 
    split_string(Q, " ", ",", [X|Y]), 
    atom_codes(W,X), 
    uni_db(Z), 
    member(W, Z). 

例:

?- is_uni("append a and b",A). 
true ; 
false. 
0
  1. あなたは原子と紛らわしい文字列です。

    "append"および'append'、a.k.a. appendは異なる。あなたはそれらの間で変換することatom_string/2を使用することができます。

    ..., atom_string(A, X), ... 
    
  2. あなたは組み込みの機能を再実装されています。

    なぜコマンドをリストに格納し、member/2を使用して繰り返しますか?

    uni_db(append). 
    uni_db(member). 
    uni_db(append1). 
    

    をそして、あなたは単にuni_db(A)かどうかを確認する必要があります。ただ、いくつかの事実を定義します。これは実装によってよりよくサポートされ、効率的に実行される可能性が高くなります。

+1

あるいはさらに良い、モジュールに述語を "定義された" と 'current_predicate(モジュール名:Predicate_name)を使用して置くことが定義されているかどうかをチェックするために'。 –

関連する問題