我知道可以定义definite clause grammars in Picat,但语法比Prolog更冗长。在Prolog中,可以更简洁地编写明确的子句语法:
pronoun --> him,her,it.
令人惊讶的是,Picat's official tutorial没有提到明确的子句语法的语法。是否可以在Picat中使用Prolog的DCG表示法?
答案 0 :(得分:2)
我有个主意。这是Picat的简单DCG转换器。 此代码是DCG格式的示例文件。
dcg([sentence, -->, noun_phrase, verb_phrase]).
dcg([noun_phrase, -->, det, noun]).
dcg([verb_phrase, -->, verb, noun_phrase]).
dcg([det, -->, [the]]).
dcg([det, -->, [a]]).
dcg([det, -->, [an]]).
dcg([noun, -->, [cat]]).
dcg([noun, -->, [bat]]).
dcg([verb, -->, [eats]]).
下一个代码是main.pi文件。
import util, io.
main([IN]) =>
writeln([IN.to_atom()]),
rw_dcg(IN.to_atom()).
rw_dcg(RF) =>
RD = open(RF),
I = 1,
MP = new_map(),
L = read_term(RD),
while (L != end_of_file)
DCG=cnv_dcg(I,MP,L),
cl_facts(DCG),
println(L),
println(DCG),
L := read_term(RD),
I := I+1
end,
close(RD).
cnv_dcg(_,MP,dcg([HD,-->,[a]])) =DCG,
Q=check_lhs(MP,HD) =>
% I don't know this code problem of "a", and why?.
DCG = HD.to_string()++"([a|X],X2)"++Q++"=> X2=X.".
cnv_dcg(_,MP,dcg([HD,-->,T])) =DCG,
list(T),
Q=check_lhs(MP,HD) =>
append(T2,[_],T.to_string()),
DCG = HD.to_string()++"("++T2++"|X],X2)"++Q++"=> X2=X.".
cnv_dcg(_,MP,dcg([HD,-->|T])) =DCG =>
LN = (T.length()+1).to_string(),
DCG = HD.to_string()++"(S1,S"++LN++") => ",
foreach(I in 1..T.length())
E=cond(I==T.length(),".",",").to_string(),
N1 = I.to_string(),
N2 = (I+1).to_string(),
DCG := DCG++T[I].to_string()++"(S"++N1++",S"++N2++")"++E.
check_lhs(MP,KY)= Q =>
(MP.has_key(KY)-> Q=" " ; Q=" ?", MP.put(KY,Q)).
接下来是转换后的代码。感谢您删除和评论。
sentence(S1,S3) => noun_phrase(S1,S2),verb_phrase(S2,S3).
noun_phrase(S1,S3) => det(S1,S2),noun(S2,S3).
verb_phrase(S1,S3) => verb(S1,S2),noun_phrase(S2,S3).
det([the|X],X2) ?=> X2=X.
det([a|X],X2) => X2=X.
det([an|X],X2) => X2=X.
noun([cat|X],X2) ?=> X2=X.
noun([bat|X],X2) => X2=X.
verb([eats|X],X2) ?=> X2=X.
答案 1 :(得分:1)
从3.0版(2020年9月26日)开始,Picat原生支持DCG规则:http://picat-lang.org/updates.txt