【问题标题】:Prolog: Checking if the first and last character of a string are left and right squiggly brackets('{' & '}')Prolog:检查字符串的第一个和最后一个字符是否是左右波浪括号('{'&'}')
【发布时间】:2017-12-03 17:54:18
【问题描述】:

我对 Prolog 很陌生,所以假设我对术语知之甚少。 我在 SWI-prolog 中使用 swipl。

我想检查一个字符串是否以左波浪括号('{')开头并以右波浪括号('}'}结束)

我在网上阅读的一些answers 引导我将以下内容编程到我的知识库中,以检查字符串是否以左波浪括号开头。

start_left_squiggle([Letter|_]):-
     Letter = '{'.

但是当我运行这个函数时,当我期望它返回 true 时,我得到了 false。

?- start_left_squiggle('{hello').
false.

同样,answers 检查最后一个字符是否为波浪形括号似乎是正确的,这让我编写了以下代码。

last_char(str, X):-
    name(S, N), 
    reverse(N, [F|_]),
    name(X, [F]).

end_right_squiggle(Werd):-
    last_char(Werd, Last),
    Last = '}'.

当我希望它返回 true 时,我在运行该函数时再次得到 false。

?- end_right_squiggle('hello}').
false.

【问题讨论】:

  • 'hello}' 在这里,您在开头和结尾没有两个大括号,因此您应该得到 false。
  • @LuaiGhunim 我正在分别对这两个函数进行测试。如果字符串以“{”开头,则第一个函数应返回 true,如果字符串以“}”结尾,则第二个函数应返回 true。字符串以什么结尾与第一个函数无关,字符串以什么开头与第二个函数无关。
  • 简单的方法是将字符串转换为列表,然后尝试做进一步的操作。

标签: string prolog equality


【解决方案1】:

像这样使用sub_atom(Atom, Before, Length, After, Subatom)

?- sub_atom('{abc}',0,1,_,C).
C = '{'.

?- sub_atom('{abc}',_,1,0,C).
C = '}'.

或者只是测试:

?- sub_atom('{abc}',0,1,_,'{').
true.

?- sub_atom('{abc}',_,1,0,'}').
true.

【讨论】:

    【解决方案2】:

    您需要做的第一件事是将原子分解为如下字符列表:

    start_with_left(H):-
       atom_chars(H,X), %here x is a list
       X = [L|_],  %get the head of the list which is frist element an compare
       L == '{'.
    

    在将原子转换为字符列表后,您可以使用递归定义检查atom 的右侧,当列表长度为1 然后将其与括号进行比较,这意味着如果最后一个元素与您相同应该得到true,否则得到False

    对是这样,是一样的,但是我们需要最后一个元素,所以我们必须使用递归:

    start_with_right(H):-
        atom_chars(H,X), %here x is a list
        length(X,Y),
        check_at_end(X,Y).
    
    check_at_end([H|_],1):-
        H == '}'.
    
    check_at_end([_|T],Y):-
        NewY is Y -1,
        check_at_end(T,NewY).
    

    .

    【讨论】:

    • H == '}',!. 行中是什么!做
    • 你可以删除它,它仍然可以工作,它被称为剪切,我无法在 cmets 中解释它。我再次编辑它
    猜你喜欢
    • 2012-12-19
    • 2013-11-26
    • 2012-08-16
    • 2020-07-15
    • 2013-01-06
    • 1970-01-01
    • 2023-03-28
    • 2019-05-11
    相关资源
    最近更新 更多