Prolog:检查字符串的第一个和最后一个字符是否为左右斜角括号(' {'&'}')

时间:2017-12-03 17:54:19

标签: string prolog equality

我对prolog很新,所以假设我知道的术语很少。 我在SWI-prolog中使用swipl。

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

我在线阅读的一些answers让我将以下内容编入我的知识库,以检查字符串是否以左边的波浪形支架开头。

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

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

?- 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时,我在运行该函数时再次出现错误。

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

2 个答案:

答案 0 :(得分:2)

像这样使用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.

答案 1 :(得分:1)

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

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).