谓词不按预期工作

时间:2014-02-01 14:59:22

标签: prolog

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.

谓词出了什么问题?

1 个答案:

答案 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