2016-06-21 47 views
0

當前我正在處理SICStus3和SICStus4之間的比較,但是我得到了一個問題,即SICStus4不會諮詢任何註釋字符串具有運輸控件或製表符等的情況下面給出。將註釋字符串轉換爲sicstus-prolog中的ASCII字符列表

下面給出的示例情況。它有3個帶逗號分隔符的參數。

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) 
     ])). 

下面的謂詞將刪除上述情況下的註釋部分。

flatten-cases :- 
     getmessage(M1), 
     write_flattened_case(M1), 
     flatten-cases. 
flatten-cases. 
write_flattened_case(M1):- 
     M1 = case(Case,_Comment,Entry),!, 
     M2 = case(Case,Entry), 
     writeq(M2),write('.'),nl. 
getmessage(M) :- 
     read(M), 
     !, 
     M \== end_of_file. 
:- flatten-cases. 

現在我的要求是將註釋字符串轉換爲ASCII字符列表。

+0

您使用的是什麼版本的SICStus 3? – false

+0

SP4中沒有SP3兼容解析器,因此上述內容無法通過任何內置功能讀入SP4。一個想法是使用SP3解析它,然後以SP4能夠理解的方式從SP3寫出它。使用類似'read(X),write_canonical(X),write('。'),nl'。 (PS。上面的代碼定義了一個帶有兩個參數的謂詞'-'',你可能想將其命名爲'flatten_cases') –

+0

3.12.10版本被使用 SICStus 3.12.10patch1(x86-linux-glibc2.3 ):Tue Nov 10 10:39:10 CET 2009 Licensed to eds.com | ? - –

回答

2

除了常規空間以外的佈局字符不能在引用原子或雙引號列表中逐字地出現。這是ISO標準的一項要求,自SICStus 3.9.0調用SICStus 3以及選項--iso以來,已在SICStus中完全實施。由於SICStus 4僅支持ISO語法。

您需要相應地插入\n\t。因此,而不是

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

現在寫

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

或者,以使其更好地讀取使用延續轉義序列:

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

注意,使用文字標籤和文字換行是很大的問題。在打印輸出中,你看不到它們!想想'A \nB'哪些不會顯示尾隨空格和尾隨標籤。

但也有許多其他情況,如:使用3270終端仿真器製作程序文本截圖,製作程序文本照片並複製輸出。過去,打卡。閱讀文件時的文本模式(最初由打卡所激發)。類似的參數適用於來自打字機的製表機,可以手動設置製表位。

然後在SO上輸入一個TAB是非常困難的。瀏覽器拒絕輸入(非常明智),如果您將其複製,則會將其呈現爲空格。


如果我在它,還有另一個問題。名稱flatten-case應該寫成flatten_case

+0

SICStus 3.12.10patch1 (x86-linux-glibc2.3):..我們在序言中是否有內置的函數來將字符串轉換爲ASCII字符列表。 –

+0

@AyyappaBoligala:不清楚字符串對你意味着什麼。 – false