Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 序言:检查字符串的第一个和最后一个字符是否为左括号和右括号(&';{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&_String_Prolog_Equality - Fatal编程技术网

String 序言:检查字符串的第一个和最后一个字符是否为左括号和右括号(&';{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&

String 序言:检查字符串的第一个和最后一个字符是否为左括号和右括号(&';{&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&&,string,prolog,equality,String,Prolog,Equality,我对prolog非常陌生,所以假设我对术语知之甚少。 我在SWI prolog中使用swipl 我想检查字符串是否以左曲括号(“{”)开始,以右曲括号(“}”)结束 我在网上读到的一些文章让我将以下内容编入我的知识库,以检查字符串是否以左括号开始 start_left_squiggle([Letter|_]):- Letter = '{'. 但是当我运行这个函数时,我得到了false,当我期望它返回true时 ?- start_left_squiggle('{hello'). fal

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

我想检查字符串是否以左曲括号(“{”)开始,以右曲括号(“}”)结束

我在网上读到的一些文章让我将以下内容编入我的知识库,以检查字符串是否以左括号开始

start_left_squiggle([Letter|_]):-
     Letter = '{'.
但是当我运行这个函数时,我得到了false,当我期望它返回true时

?- start_left_squiggle('{hello').
false.
?- end_right_squiggle('hello}').
false.
同样,这对于检查最后一个字符是否是弯曲的括号似乎是正确的,这让我编写了以下代码

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

end_right_squiggle(Werd):-
    last_char(Werd, Last),
    Last = '}'.
当运行函数时,我再次得到false,当我期望它返回true时

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

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

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 == '{'.
将原子转换为字符列表后,可以使用递归定义检查原子的右侧,当列表长度为
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('{abc}',0,1,_,C).
C = '{'.

?- sub_atom('{abc}',_,1,0,C).
C = '}'.
或者只是测试:

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

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

'hello}'
这里的开头和结尾没有两个花括号,因此应该为false。@LuaiGhunim我正在分别对这两个函数执行测试。如果字符串以“{”开头,第一个函数应该返回true;如果字符串以“}”结尾,第二个函数应该返回true“。字符串以什么结尾与第一个函数无关,字符串以什么开头与第二个函数无关。简单的方法是将字符串转换为一个列表,然后尝试执行进一步的操作。在
H='}'行中,!。
什么是!正在执行的操作您可以删除它,它仍然有效,它被称为cut,我无法执行把它放在评论里,我再编辑一次