首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Picat中使用定从句语法

在Picat中使用定从句语法
EN

Stack Overflow用户
提问于 2016-02-29 05:05:47
回答 2查看 174关注 0票数 2

我知道可以定义definite clause grammars in Picat,但是它的语法比Prolog要冗长得多。在Prolog中,定从句语法可以写得更简洁:

代码语言:javascript
复制
pronoun --> him,her,it.
EN

回答 2

Stack Overflow用户

发布于 2018-02-23 09:11:20

我有个主意。这是一个用于Picat的简单DCG转换器。此代码是类DCG格式的示例文件。

代码语言:javascript
复制
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文件。

代码语言:javascript
复制
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)).

接下来是转换后的代码。感谢您的删除和评论。

代码语言:javascript
复制
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.
票数 2
EN

Stack Overflow用户

发布于 2020-12-07 13:57:17

从3.0版本(2020年9月26日)开始,Picat原生支持DCG规则:http://picat-lang.org/updates.txt

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/35688266

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档