2015-10-31 3 views
1

Я должен написать предикат, чтобы сделать работу, как следующее:Дать предикат, чтобы добавить атомы

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

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

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

Пожалуйста, помогите ..

+0

Ваши предикаты выписывают желаемый результат, но также показывают, например, 'X = X', поскольку третий аргумент не имеет никакой цели и вы его не используете (таким образом, у вас есть' _' для аргумента в вашем предикате положения). Итак, 'cat (X, G): - ...'. Также обратите внимание, что вам понадобится 'nl' после вашей последней записи для вывода новой строки. – lurker

+0

Мне нужно сделать это Ternary, не могу сделать его двоичным. Эта проблема не исчезает, поэтому просят о помощи. – ela

+0

Тогда не используйте 'write', а используйте третий аргумент для результата, как показывают данные ответы. – lurker

ответ

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 произвели ошибку.

+0

Спасибо. Он работает в SWI-Prolog. Но в моем компиляторе он дает ошибку, например - Неопределенный предикат: atom_chars/2. Любые предопределенные предикаты не могут использоваться, что затрудняет запись такого функтора, который может использовать только некоторые основные команды Prolog. Пожалуйста, помогите .. – ela

+0

@ela: Какая система это? Какие у вас встроенные атомы? – false

+0

Это NU-Prolog. Источником, откуда я изучаю этот язык, является обучение с использованием этого компилятора. Я пытаюсь использовать свой код как для SWI-Prolog, так и для NU-Prolog. Многие коды, похоже, работают над SWI-Prolog, но не работают на NU-Prolog. Пожалуйста, помогите .. – ela

1

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 делает ... вау, такой простой предикат, поэтому поведение богатое!

+1

См. Пролог Пролога для ['append/3'] (http://www.complang.tuwien.ac.at/ulrich/iso-prolog/prologue#append). – false

+2

'append/3'. ** нет ** произведение с любым шаблоном создания. В качестве примера рассмотрим: «append (Xs, [a], Xs)», который должен сбой, но цикл. Кроме того, 'append/3' требует создания первого или последнего аргумента (на самом деле, немного больше). В противном случае он не заканчивается. – false

+1

@false: большое спасибо ... – CapelliC

Смежные вопросы