我收到了编写Prolog程序的任务,该程序可以列出“字符串”的所有“子字符串”,其末尾带有'a'字符,长度至少为两个字符。
例如:
?- avegu("baka", R).
R = "ba";
R = "baka";
R = "aka";
R = "ka";
false.
我的想法是我应该将给定的字符列表(字符串)拆分为[Head | Tail]并递归调用它。当Head为'a'时,返回我迭代的子字符串,然后继续执行直到列表的结尾。我不知道如何实现这个想法。
答案 0 :(得分:3)
你在这里触及一些问题。
首先,您希望该字符串由字符列表表示。最简单的方法是使用指令
<CR:CrystalReportViewer ID="CrystalReportViewer1" runat="server" AutoDataBind="True" ToolPanelView="None" EnableDrillDown="False" HasCrystalLogo="False" HasDrilldownTabs="False" HasDrillUpButton="False" />
请注意,单个字符不需要任何额外的引用!因此
protected void Page_Load(object sender, EventArgs e)
{
string report = Request.QueryString["title"].ToString();
ReportDocument rptDoc = new ReportDocument();
DataSet ds = (DataSet)Session["printreport"];
if (report == "PayslipReport")
{
rptDoc.Load(Server.MapPath("~/Payslipreports.rpt"));
}
rptDoc.SetDataSource(ds);
CrystalReportViewer1.ReportSource = rptDoc;
CrystalReportViewer1.RefreshReport();
}
然后,使用dcg:
可以轻松完成:- set_prolog_flag(double_quotes, chars).
有关如何使用双引号获取答案,请参阅this answer。
答案 1 :(得分:2)
如果我使用原子而不使用字符串,那么我可以使用atom_length/2
和sub_atom/5
但如果使用SWI则“string”也相同。
babakaakaka(X, Sub) :-
atom_length(X, Len),
sub_atom(X, _, Sub_len, _, Sub),
between(2, Len, Sub_len),
sub_atom(Sub, _, 1, 0, a).
然后我写道:
?- babakaakaka(baka, X).
X = ba ;
X = baka ;
X = aka ;
X = ka ;
false.