atom_codes/2 это ISO утвержденных предикат для преобразования между атомом и список кодов. Когда у вас есть 2 списка, соответствующие первым двум аргументам, добавьте/3 (увы, не одобренный ISO, но AFAIK доступен в каждом Prolog), получит список, соответствующий третьему аргументу, затем преобразует этот список в атом ...
Обратите внимание, что, хотя append/3 является «чистым» предикатом Prolog и может работать с любым шаблоном создания, atom_codes/2 требует хотя бы один из его аргументов. Вот реализация SWI-Prolog для cat/3, «работающая» в более общем плане. Я надеюсь, что это будет вдохновлять вас, чтобы узнать больше о Прологе ...
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 делает ... вау, такой простой предикат, поэтому поведение богатое!
Ваши предикаты выписывают желаемый результат, но также показывают, например, 'X = X', поскольку третий аргумент не имеет никакой цели и вы его не используете (таким образом, у вас есть' _' для аргумента в вашем предикате положения). Итак, 'cat (X, G): - ...'. Также обратите внимание, что вам понадобится 'nl' после вашей последней записи для вывода новой строки. – lurker
Мне нужно сделать это Ternary, не могу сделать его двоичным. Эта проблема не исчезает, поэтому просят о помощи. – ela
Тогда не используйте 'write', а используйте третий аргумент для результата, как показывают данные ответы. – lurker