我正在学习Prolog,这可能是一个非常简单的问题。
说我只需要一个执行以下操作的程序:
before(5, [1, 2, 4, 5, 36, 5], Result)
...
Result = [1, 2, 4, 5]
我知道如果N是第一个元素,我可以添加以下规则:
before(N, [N|_], Result) :- Result = [N].
但是我应该为其他案件做些什么?
答案 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。第二个答案给出了正确的结果,避免了这个无用的选择点,效率更高。
也在