2013-06-27 7 views
0

мне нужно (для проектных решений), чтобы получить список, который уважает следующую закономерность:пролог, как правильно использовать управляющие последовательности

Uses = ['foo\/1', 'foobar\/2']. 

Я могу создать шаблон имя/номер делает :

all((P\/A), (rule(X, Ux, _, Module), member(U, Ux), U = (P/A)), Uses). 

где правило является внутренним фактом, а Ux - это список.

Я могу легко сбрасывать слэш, используя ярлык '/', но как насчет ввода (P/A) между кавычками?

Как это сделать? пожалуйста помогите.

+1

Если вы правильно поняли, если вы оставите бегство и просто используйте 'P/A', вы получите что-то вроде' Uses = [foo/1, foobar/2] 'без кавычек или экранов. Но это зависит от того, какое 'rule' производит для' Ux'. Элементам 'Ux' должен быть формат' blah/3' (без кавычек или экранов). – lurker

+1

'? - все (P \/A, член (P/A, [x, x/y, y]), L). L = [x \/y] 'Я думаю, вы должны * не * работать с атомами (т. Е. Цитируемые выражения). В чем цель «использования»? – CapelliC

+0

Использование будет содержать тело X, которое является предикатом. Из-за требования к сериализации (JSON) каждый член Uses должен быть совместим с json TERM и таким образом помещаться между кавычками. – ameyer

ответ

0

Если вы хотите получить 'foo/1', вы можете легко использовать atomic_list_concat/2 предикат следующим образом:

Functor=foo, 
Arity=1, 
atomic_list_concat([Functor, '/', Arity], Output). 

В этом случае Output переменная будет связан 'foo/1' срок.

+0

он работает! Спасибо! – ameyer

0

Просто поместите их между 3 верхушек:

?- A=foo, B=1, writeln('''A/B'''). 
'A/B' 
A = foo, 
B = 1