list_trawler([44|_],_).
list_trawler([H|T],[H|T1]) :-
list_trawler(T,T1).
这个谓词应该带两个列表(比如“hello,world”和“hello”),如果第二个列表是第一个列表的第一个成员,则返回true,直到有逗号([44])。但是,虽然它几乎可以工作,但它返回列表AND _G395。我想摆脱_G395。
例如,
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.
谓词出了什么问题?
答案 0 :(得分:0)
由于基本情况下的_G395
参数,您获得了_
:
list_trawler([44|_], _).
这说,“拖网”任何以逗号开头的列表(不管尾部是什么)都是“什么”(我不在乎)。你可能会同意这不是一份准确的陈述。 _
是一个“不关心”的术语,它不是你在第二个论点中的真正含义。在这种情况下,你非常关心第二个参数是什么。我认为,根据您的描述,您希望它成为空列表。
所以你的基本情况应该是:
list_trawler([44|_], []). % Ignore everything after comma
这表示,在基本情况下,“拖网”任何以逗号开头的列表(不管尾部是什么)都是一个空列表。
然后:
| ?- 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