【问题标题】:Prolog member function should work but it doesntProlog 成员函数应该可以工作,但它没有
【发布时间】:2016-12-19 22:02:53
【问题描述】:

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

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

uni_db([
    append,
    member,
    append1
    ]).

【问题讨论】:

    标签: prolog unification


    【解决方案1】:

    您需要使用atom_codes/2 谓词将stings 转换为原子,例如您需要将"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.
    

    【讨论】:

      【解决方案2】:
      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)。这得到了实施的更好支持,更有可能有效地完成。

      【讨论】:

      • 或者更好的是,将“已定义”谓词放在一个模块中,并使用current_predicate(Module_name:Predicate_name) 来检查它是否已定义。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-06-30
      • 1970-01-01
      • 1970-01-01
      • 2020-05-16
      • 1970-01-01
      相关资源
      最近更新 更多