【问题标题】:Predicate not working as supposed to谓词没有按预期工作
【发布时间】:2014-02-01 14:59:21
【问题描述】:
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.

谓词有什么问题?

【问题讨论】:

    标签: prolog


    【解决方案1】:

    由于基本情况下的 _ 参数,您得到了 _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
    

    【讨论】:

      猜你喜欢
      • 2020-07-02
      • 1970-01-01
      • 1970-01-01
      • 2020-08-12
      • 1970-01-01
      • 2021-10-19
      • 2020-03-18
      • 2012-06-14
      • 2014-11-15
      相关资源
      最近更新 更多