Prolog:检查字符串的第一个和最后一个字符是否为左右波浪形括号('{' & '}')
Prolog: Checking if the first and last character of a string are left and right squiggly brackets('{' & '}')
我是 prolog 的新手,所以假设我对术语知之甚少。
我在 SWI-prolog 中使用 swipl。
我想检查字符串是否以左波浪括号 ('{') 开头并以右波浪括号('}') 结尾}
我在网上阅读的一些 answers 引导我将以下内容编程到我的知识库中,以检查字符串是否以左波浪括号开头。
start_left_squiggle([Letter|_]):-
Letter = '{'.
但是当我 运行 这个函数时,我得到 false,当我期望它时 return 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 = '}'.
当 运行 调用该函数时,我再次得到 false,而我期望它 return 为 true。
?- end_right_squiggle('hello}').
false.
您需要做的第一件事是将原子分解成这样的字符列表:
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).
.
像这样使用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.
我是 prolog 的新手,所以假设我对术语知之甚少。 我在 SWI-prolog 中使用 swipl。
我想检查字符串是否以左波浪括号 ('{') 开头并以右波浪括号('}') 结尾}
我在网上阅读的一些 answers 引导我将以下内容编程到我的知识库中,以检查字符串是否以左波浪括号开头。
start_left_squiggle([Letter|_]):-
Letter = '{'.
但是当我 运行 这个函数时,我得到 false,当我期望它时 return 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 = '}'.
当 运行 调用该函数时,我再次得到 false,而我期望它 return 为 true。
?- end_right_squiggle('hello}').
false.
您需要做的第一件事是将原子分解成这样的字符列表:
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).
.
像这样使用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.