编写谓词来添加原子

时间:2015-10-31 09:37:18

标签: prolog

我必须编写一个谓词来完成如下工作:

  ?- cat(north,south,X).
  X = northsouth

  ?- cat(alley,'91',Y).
  X = alley91

  ?-cat(7,uthah,H).
    Bad Input
    H = H

请帮助..

2 个答案:

答案 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/2atom_concat/3产生了错误。