在列表中的X之前查找元素

时间:2018-04-07 14:57:55

标签: prolog logic

我正在学习Prolog,这可能是一个非常简单的问题。

说我只需要一个执行以下操作的程序:

before(5, [1, 2, 4, 5, 36, 5], Result)
...
Result = [1, 2, 4, 5]

我知道如果N是第一个元素,我可以添加以下规则:

before(N, [N|_], Result) :- Result = [N].

但是我应该为其他案件做些什么?

1 个答案:

答案 0 :(得分:2)

一个非常简单的解决方案:

before( _, [], []).
before( N, [N|_], [N]).
before( N, [X|T], [X|Res]):- dif(N,X), before( N, T, Res).

示例:

?- before(5, [1, 2, 4, 5, 36, 5], Result).
Result = [1, 2, 4, 5] ;
false.

使用if_/3中的library(reif)更优雅的解决方案:

:- use_module(library(reif)).

before( _, []   , [] ).
before( N, [X|T], Res):- 
            if_( X = N, 
                 Res = [N],
                 (before( N, T, Res2), Res = [X|Res2] )
               ).

示例:

?- before(5, [1, 2, 4, 5, 36, 5], Result).
Result = [1, 2, 4, 5].

正如你所看到的,这是确定性的,它只给出了一个答案而没有留下选择点。在第一个答案中给出了相同的结果,但有一个选择点返回false。第二个答案给出了正确的结果,避免了这个无用的选择点,效率更高。

也在