2016-06-21 2 views
0

Actuellement je travaille sur la comparaison entre SICStus3 et SICStus4 mais j'ai un problème qui est SICStus4 ne consultera aucun cas où la chaîne de commentaire a des contrôles de transport ou des caractères de tabulation etc. donnée ci-après.convertir la chaîne de commentaire en une liste de caractères ASCII dans sicstus-prolog

cas de l'exemple donné en tant que below.It dispose de 3 arguments avec délimiteur de virgule.

case('pr_ua_sfochi'," 
Response: 
answer(amount(2370.09,usd),[[01AUG06SFO UA CHI Q9.30 1085.58FUA2SFS UA SFO Q9.30 1085.58FUA2SFS NUC2189.76END ROE1.0 XT USD 180.33 ZPSFOCHI 164.23US6.60ZP5.00AY XF4.50SFO4.5]],amount(2189.76,usd),amount(2189.76,usd),amount(180.33,usd),[[fua2sfs,fua2sfs]],amount(6.6,usd),amount(4.5,usd),amount(0.0,usd),amount(18.6,usd),lasttktdate([20061002]),lastdateafterres(200712282]),[[fic_ticketinfo(fare(fua2sfs),fic([]),nvb([]),nva([]),tktiss([]),penalty([]),tktendorsement([]),tourinfo([]),infomsgs([])),fic_ticketinfo(fare(fua2sfs),fic([]),nvb([]),nva([]),tktiss([]),penalty([]),tktendorsement([]),tourinfo([]),infomsgs([]))]],<>,<>,cat35(cat35info([]))) 
. 
02/20/2006 17:05:10 Transaction 35 served by static.static.server1 (usclsefat002:7551) running E*Fare version $Name: build-2006-02-19-1900 $ 

",price(pnr(
     user('atl','1y',<>,<>,dept(<>,'0005300'),<>,<>,<>), 
     [ 
       passenger(adt,1,[ptconly(n)]) 
     ], 
     [ 

segment(1,sfo,chi,'ua','<>','100',20140901,0800,f,20140901,2100,'737',res(20140628,1316),hk,pf2(n,[],[],n),<>,flags(no,no,no,no,no,no,no,no,no)), 

segment(2,chi,sfo,'ua','<>','101',20140906,1000,f,20140906,1400,'737',res(20140628,1316),hk,pf2(n,[],[],n),<>,flags(no,no,no,no,no,no,no,no,no)) 
     ]),[ 
       rebook(n), 
       ticket(20140301,131659), 
       dbaccess(20140301,131659), 
       platingcarrier('ua'), 
       tax_exempt([]), 
       trapparm("trap:ffil"), 
       city(y) 
     ])). 

Le prédicat ci-dessous va supprimer la section des commentaires dans le cas ci-dessus. Maintenant, mon exigence est de convertir la chaîne de commentaire en une liste de caractères ASCII.

+0

Quelle version de SICStus 3 utilisez-vous? – false

+0

Il n'y a pas d'analyseur compatible SP3 dans le Service Pack 4, ce qui précède ne peut être lu dans SP4 par aucune fonctionnalité intégrée. Une idée serait d'utiliser SP3 pour l'analyser, puis de l'écrire à partir du SP3 d'une manière que le SP4 comprend, par ex. en utilisant quelque chose comme 'read (X), write_canonical (X), write ('.'), nl'. (PS.) Le code ci-dessus définit un prédicat '' -'' avec deux arguments, vous voulez probablement le nommer 'flatten_cases' à la place.) –

+0

La version 3.12.10 est utilisée SICStus 3.12.10patch1 (x86-linux-glibc2.3): mar 10 novembre 10:39:10 CET 2009 Licensed to eds.com | ? - –

Répondre

2

Les caractères de mise en forme autres qu'un espace normal ne peuvent pas se produire littéralement dans un atome entre guillemets ou dans une liste entre guillemets. Ceci est une exigence de la norme ISO et est entièrement implémenté dans SICStus depuis 3.9.0 invoquant SICStus 3 avec l'option --iso. Depuis SICStus 4, seule la syntaxe ISO est prise en charge. Vous devez insérer \n et \t en conséquence. Ainsi, au lieu de

log('Response: 
    yes').  % BAD! 

Maintenant, écrivez

log('Response:\n\tyes'). 

Ou, pour en faire une meilleure utilisation lisible une séquence d'échappement de continuation:

log('Response:\n\ 
\tyes'). 

Notez que l'utilisation des onglets littérales et des sauts de ligne littérale est très problématique . Sur une impression, vous ne les voyez pas! Pensez à 'A \nB' qui n'afficherait pas les espaces de fin ni les onglets de fin.

Mais il y a aussi beaucoup d'autres situations comme: Faire une capture d'écran du texte du programme, faire une photo du texte du programme, utiliser un émulateur de terminal 3270 et copier la sortie. Dans le passé, des cartes perforées. Le mode texte lors de la lecture de fichiers (initialement motivé par des cartes perforées). Des arguments similaires sont valables pour la tabulatrice qui provient des machines à écrire avec leurs tabulations réglables manuellement.

Et puis SO il est assez difficile de taper dans un onglet. Le navigateur refuse de le taper (très judicieusement), et si vous le copiez, vous le convertissez en espaces.


Si j'y suis, il y a aussi un autre problème. Le nom flatten-case devrait plutôt être écrit flatten_case.

+0

SICStus 3.12.10patch1 (x86-linux-glibc2.3): ..Avons-nous une fonction intégrée dans prolog pour convertir la chaîne en liste de caractères ASCII. –

+0

@AyyappaBoligala: Pas clair ce que signifie une chaîne pour vous. – false