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
]).
你混淆了字符串和原子。
"append"
和 'append'
、a.k.a。 append
,不同。您可以使用 atom_string/2
在它们之间进行转换:
..., atom_string(A, X), ...
您正在重新实现内置功能。
为什么要将命令存储在列表中并使用 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.
我正在尝试检查字符串是否是可以执行的工作调用。为此,我解析字符串,获取第一个单词,如果它与预定义函数的数据库匹配,它应该会成功。 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
]).
你混淆了字符串和原子。
"append"
和'append'
、a.k.a。append
,不同。您可以使用atom_string/2
在它们之间进行转换:..., atom_string(A, X), ...
您正在重新实现内置功能。
为什么要将命令存储在列表中并使用
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.