2016-12-19 45 views
1

我想檢查一個字符串是否可以執行的工作調用。爲此,我解析字符串,得到第一個單詞,如果它匹配預定義函數的數據庫,它應該成功。 Q有字符串,A稍後會用,現在不用。字符串的例子是:追加a和b。Prolog成員函數應該可以工作,但它不會

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

uni_db([ 
    append, 
    member, 
    append1 
    ]). 

回答

0

您需要使用atom_codes/2謂詞蜇轉換成原子,例如在你需要"append"轉換爲append爲了工作。

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',又名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(MODULE_NAME:Predicate_name)'檢查它是否被定義。 –

相關問題