所有子串在末尾都带有'a'字符

时间:2017-04-19 10:16:11

标签: prolog substring

我收到了编写Prolog程序的任务,该程序可以列出“字符串”的所有“子字符串”,其末尾带有'a'字符,长度至少为两个字符。

例如:

?- avegu("baka", R).
R = "ba";
R = "baka";
R = "aka";
R = "ka";
false.

我的想法是我应该将给定的字符列表(字符串)拆分为[Head | Tail]并递归调用它。当Head为'a'时,返回我迭代的子字符串,然后继续执行直到列表的结尾。我不知道如何实现这个想法。

2 个答案:

答案 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();
 }

然后,使用

可以轻松完成
:- set_prolog_flag(double_quotes, chars).

有关如何使用双引号获取答案,请参阅this answer

答案 1 :(得分:2)

如果我使用原子而不使用字符串,那么我可以使用atom_length/2sub_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.