Prolog 成员函数应该工作,但它不

Prolog member function should work but it doesnt

我正在尝试检查字符串是否是可以执行的工作调用。为此,我解析字符串,获取第一个单词,如果它与预定义函数的数据库匹配,它应该会成功。 Q有字符串,A以后会用到,现在不用了。字符串的例子是:append a and b.

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

uni_db([
    append,
    member,
    append1
    ]).
  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)。这得到了实现的更好支持,并且更有可能有效地完成。

您需要使用 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.