我正在使用Prolog编写URI解析器,但目前我被一个更简单的问题卡住了。我需要检查一个字符串是否包含特定字符“:”,如果有,我希望得到该字符之前的所有字符组成的字符串。
这是我的程序:
% caratteri speciali
colonCheck(S) :-
string_to_atom([S], C),
C = ':'. % S==:
headGetter([H|T], [H]) :-
!.
% struttura uri
uri(Scheme, Userinfo, Host, Port, Path, Query, Fragment).
% parsing uri
parsed_uri(UriInput, uri(Scheme,Userinfo,Host,Port,Path,Query,Fragment)) :-
scheme(UriInput, uri(S,Userinfo,Host,Port,Path,Query,Fragment)),
not(headGetter(UriInput, ':')),
!,
string_to_atom([S], Scheme).
% controllo Scheme, in ingresso ho i dati da controllare e l'oggetto uri che
% mi servirà per inviarlo al passaggio successivo ho trovato i due punti
scheme([H|T], uri(Scheme,Userinfo,Host,Port,Path,Query,Fragment)):-
colonCheck(H),
!,
end(Scheme).
% non trovo i due punti e procedo a controllare il prossimo carattere
% (la testa dell'attuale coda)
scheme([H|T], uri(Scheme,Userinfo,Host,Port,Path,Query,Fragment)):-
not(colonCheck(H)),
scheme(T, uri(This, Userinfo,Host,Port,Path,Query,Fragment)),
append([H], This, Scheme).
%fine computazione
end([S]).
给出这个结果:
?- scheme("http:", uri(A,_,_,_,_,_,_)).
A = [104, 116, 116, 112, _G1205].
我认为这部分是正确的,但现在我想将字符列表转换为字符串,因此我将最后一行更改为:
end([S]) :-
string_to_atom([S], K).
但是我收到了这个错误信息:
错误:string_to_atom/2:参数未充分实例化
我可能漏掉了什么。你能告诉我是什么吗?
scheme/2
的end(Scheme)
中,end/1
规则会创建一个自由变量。如果这是您想要的,那么可以,但似乎正是这个自由变量导致了调用string_to_atom/2
时出现错误。另外,最好指定您正在使用哪个Prolog,以便讨论任何可能存在的怪癖。 - hardmath_Gnnnn
的方式。我认为如上所述,这是通过调用end/1
来绑定你在解析 URI 时的终端情况中的 Scheme 所致。该调用成功地将一个自由变量 S 绑定到你的字符代码字符串/列表的最后一个条目中。因此,我想问一下,在字符代码字符串/列表的结尾是否真的需要这个自由变量。 - hardmathend([ ])
,也就是用一个空的尾部来完成列表? - hardmath