2015-08-11 23 views
5

Bir Prolog listesini./2 biçiminde, ör. Açıklamalarda belirttiği şekilde'raw' .2/2 biçiminde bir liste görüntüleme

L = .(a, .(b, .(c, []))). 
+3

Herhangi bir ISO uyumlu sistemde 'write_canonical/1' kontrol edin! 'write_canonical/1', mantığınız olan terimlerin kesin şekli hakkında şüpheleriniz olduğunda her zaman çok kullanışlıdır. Örnek: SICStus Prolog: '? - write_canonical ([a, b, c])., Yieding:' '.' (A, '.' (B, '.' (C, [])) '. Ayrıştırılması kolay gerçek bir kanonik temsili vermeyi amaçlayan veri alışverişi için de çok değerli bir yüklem. – mat

+2

L = [a, b, c], yazma_kanonik (L). bir tedavi çalıştı! Şu anda sicstus kullanıyorum, bazen evde swi. Aynı sonuca ulaşmak için başka yollar var mı acaba? – bph

+3

'write_canonical/1', bunu yapmanın standart ve en iyi yoludur. Tabii ki bunu da kendiniz uygulayabilirsiniz, "arg/3", '= ../2' vb. Ile termik muayene ve ayrıştırma. – mat

cevap

4

Normalde write_canonical(List) veya ?- write_term(List, [quoted(true), ignore_ops(true)]): listesi için

:

| ?- L=[a,b,c]. 
L = [a,b,c] ? 
yes 

ekrana bir araç var mı. SWI-Prolog do things differently karar beri bu yeterince iyi değil:

?- write_canonical([a]). 
[a] 
true. 

?- write_term([a], [quoted(true), ignore_ops(true)]). 
[a] 
true. 

?- write_term([a], [dotlists(true)]). 
.(a,[]) 
true. 

, documentation on write_term/2 Bkz seçenekleri brace_terms(Bool) ve dotlists(Bool) dikkat edin. Ama dikkat: SWI-Prolog 7'yi normal olarak başlatırsanız, ./2 artık liste functor değildir! Eğer swipl --traditional ile başlatırsanız

?- L = .(a, []). 
ERROR: Type error: `dict' expected, found `a' (an atom) % WHAT? 

?- L = '[|]'(a, []). 
L = [a]. 

, işler bir şekilde, normale döndü:

$ swipl --traditional 
Welcome to SWI-Prolog (Multi-threaded, 64 bits, Version 7.3.4-32-g9311e51) 
Copyright (c) 1990-2015 University of Amsterdam, VU Amsterdam 
SWI-Prolog comes with ABSOLUTELY NO WARRANTY. This is free software, 
and you are welcome to redistribute it under certain conditions. 
Please visit http://www.swi-prolog.org for details. 

For help, use ?- help(Topic). or ?- apropos(Word). 

?- L = .(a, []). 
L = [a]. 

Hala write_canonical(List) veya write_term(List, [quoted(true), ignore_ops(true)]) kullanamaz.

Ayrıntılar ve mantık için SWI-Prolog belgelerinin bağlantılı bölümünü okuyun. Bir öneri olarak, SWI-Prolog stick'i varsayılan olarak SWI-Prolog 7'ye kullanmaya karar verirseniz ve başka bir Prolog uygulamasıyla iletişim kurmanız gerekiyorsa yalnızca write_term(List, [dotlists(true)])'u kullanın. Her zamanki liste notasyonu, [a, b, ...], çoğu geleneksel durumda yeterince iyi olmalıdır.

İlgili konular