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

时间:2016-12-19 22:02:53

标签: prolog unification

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

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

uni_db([
    append,
    member,
    append1
    ]).

2 个答案:

答案 0 :(得分:0)

  1. 你将字符串与原子混淆。

    "append"'append',a.k.a。append是不同的。您可以使用atom_string/2进行转换:

    ..., atom_string(A, X), ...
    
  2. 您正在重新实现内置功能。<​​/ p>

    为什么要将命令存储在列表中并使用member/2进行迭代?只需定义一些事实:

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

    然后,您只需检查是否uni_db(A)。这可以通过实施得到更好的支持,并且更有可能有效地完成。

答案 1 :(得分: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.