编写谓词以添加原子
Writing a predicate to add atoms
我必须编写一个谓词来完成如下工作:
?- cat(north,south,X).
X = northsouth
?- cat(alley,'91',Y).
X = alley91
?-cat(7,uthah,H).
Bad Input
H = H
请帮忙..
atom_codes/2 这是 ISO 批准的谓词,用于在原子和代码列表之间进行转换。当你有 2 个列表对应于前两个参数时,append/3(唉,不是 ISO 批准的,但 AFAIK 在每个 Prolog 中可用),将获得对应于第三个参数的列表,然后,将该列表转换为原子......
请注意,虽然 append/3 是一个 'pure' Prolog 谓词,并且可以使用任何实例化模式,但 atom_codes/2 至少需要 其中一个参数实例化。这是 cat/3、'working' 的 SWI-Prolog 实现,更普遍一些。我希望它能激发您阅读更多关于 Prolog 的信息...
ac(X,Xs) :- when((ground(X);ground(Xs)), atom_codes(X,Xs)).
cat(X,Y,Z) :- maplist(ac, [X,Y,Z],[Xs,Ys,Zs]), append(Xs,Ys,Zs).
编辑
如@false 所述,我对 append/3 的看法是错误的。现在我将尝试更好地理解 append/3 的作用...哇,一个如此简单的谓词,如此丰富的行为!
atom_concat_redefined(A1, A2, A3) :-
( nonvar(A1) -> atom_chars(A1, Chs1) ; true ),
( nonvar(A2) -> atom_chars(A2, Chs2) ; true ),
( nonvar(A1), nonvar(A2) -> true ; atom_chars(A3, Chs3) ),
append(Chs1, Chs2, Chs3),
atom_chars(A1, Chs1),
atom_chars(A2, Chs2),
atom_chars(A3, Chs3).
此定义在 SICStus 或 GNU 等符合标准的实现中产生相同的错误 - 除了性能之外,应该没有其他差异。要比较错误,请使用目标:
| ?- catch(atom_concat_redefined(A,B,abc+1), error(E,_), true).
E = type_error(atom,abc+1) ? ;
no
请注意 error(E,_)
中的下划线,它隐藏了实现定义的差异。实现在这个论点中提供了额外的信息,特别是,它们会揭示 atom_chars/2
或 atom_concat/3
产生了错误。
我必须编写一个谓词来完成如下工作:
?- cat(north,south,X).
X = northsouth
?- cat(alley,'91',Y).
X = alley91
?-cat(7,uthah,H).
Bad Input
H = H
请帮忙..
atom_codes/2 这是 ISO 批准的谓词,用于在原子和代码列表之间进行转换。当你有 2 个列表对应于前两个参数时,append/3(唉,不是 ISO 批准的,但 AFAIK 在每个 Prolog 中可用),将获得对应于第三个参数的列表,然后,将该列表转换为原子......
请注意,虽然 append/3 是一个 'pure' Prolog 谓词,并且可以使用任何实例化模式,但 atom_codes/2 至少需要 其中一个参数实例化。这是 cat/3、'working' 的 SWI-Prolog 实现,更普遍一些。我希望它能激发您阅读更多关于 Prolog 的信息...
ac(X,Xs) :- when((ground(X);ground(Xs)), atom_codes(X,Xs)).
cat(X,Y,Z) :- maplist(ac, [X,Y,Z],[Xs,Ys,Zs]), append(Xs,Ys,Zs).
编辑
如@false 所述,我对 append/3 的看法是错误的。现在我将尝试更好地理解 append/3 的作用...哇,一个如此简单的谓词,如此丰富的行为!
atom_concat_redefined(A1, A2, A3) :-
( nonvar(A1) -> atom_chars(A1, Chs1) ; true ),
( nonvar(A2) -> atom_chars(A2, Chs2) ; true ),
( nonvar(A1), nonvar(A2) -> true ; atom_chars(A3, Chs3) ),
append(Chs1, Chs2, Chs3),
atom_chars(A1, Chs1),
atom_chars(A2, Chs2),
atom_chars(A3, Chs3).
此定义在 SICStus 或 GNU 等符合标准的实现中产生相同的错误 - 除了性能之外,应该没有其他差异。要比较错误,请使用目标:
| ?- catch(atom_concat_redefined(A,B,abc+1), error(E,_), true).
E = type_error(atom,abc+1) ? ;
no
请注意 error(E,_)
中的下划线,它隐藏了实现定义的差异。实现在这个论点中提供了额外的信息,特别是,它们会揭示 atom_chars/2
或 atom_concat/3
产生了错误。