我必须编写一个谓词来完成如下工作:
?- cat(north,south,X).
X = northsouth
?- cat(alley,'91',Y).
X = alley91
?-cat(7,uthah,H).
Bad Input
H = H
请帮助..
答案 0 :(得分:1)
atom_codes / 2它是ISO批准的谓词,用于在原子和代码列表之间进行转换。当你有两个对应于前两个参数的列表时,追加/ 3(唉,不是ISO批准,但每个Prolog中都有AFAIK),将得到对应于第三个参数的列表,然后,将该列表转换为atom ...
请注意,虽然append / 3是一个'纯'Prolog谓词,并且可以使用任何实例化模式,atom_codes / 2 需要至少其中一个参数被实例化。这是一个关于cat / 3的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的作用...哇,一个如此简单的谓词,所以行为丰富!
答案 1 :(得分:1)
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
产生了错误。