Prolog 谓词未按预期工作

Prolog 谓词未按预期工作,prolog,Prolog,如果第二个列表是第一个列表的第一个成员,那么这个谓词应该包含两个列表(比如“hello,world”和“hello”),并返回true,直到出现逗号([44])。然而,尽管它几乎可以工作,但它返回列表和_G395。我想摆脱G395 比如说, list_trawler([44|_],_). list_trawler([H|T],[H|T1]) :- list_trawler(T,T1). 谓词有什么问题?您得到的是\u G395,因为基本情况下的\u参数: 2 ?- list_trawl

如果第二个列表是第一个列表的第一个成员,那么这个谓词应该包含两个列表(比如“hello,world”和“hello”),并返回true,直到出现逗号([44])。然而,尽管它几乎可以工作,但它返回列表和_G395。我想摆脱G395

比如说,

list_trawler([44|_],_).
list_trawler([H|T],[H|T1]) :-
    list_trawler(T,T1).

谓词有什么问题?

您得到的是
\u G395
,因为基本情况下的
\u
参数:

2 ?- list_trawler("hello, world",X).
X = [104, 101, 108, 108, 111|_G395] 
3 ?- list_tralwer([43,78,12,90,44,12,67,98],X).
Correct to: "list_trawler([43,78,12,90,44,12,67,98],X)"? yes
X = [43, 78, 12, 90|_G30] ;
false.
这意味着,“拖网”任何以逗号开头的列表(不管尾部是什么)都是“随便”(我不在乎)。你可能会同意这不是一个准确的说法。
\uu
是一个“不在乎”的术语,它不是您在第二个参数中真正的意思。在这种情况下,你非常关心第二个论点是什么。根据你的描述,我认为你希望它是一张空名单

因此,您的基本情况应该是:

list_trawler([44|_], _).
这意味着,在基本情况下,“拖网”任何以逗号开头的列表(不管尾部是什么)都是空列表

然后:

同样地:

| ?- list_trawler("hello, world", L).

L = [104,101,108,108,111] ? ;

no
以及:

| ?- list_trawler("hello, world", L).

L = [104,101,108,108,111] ? ;

no
| ?- list_trawler("hello, world", "hello").

true ? a

no
| ?- list_trawler([43,78,12,90,44,12,67,98],X).

X = [43,78,12,90] ? a

no