我最近开始学习Prolog,我无法解决如何组合三个列表的问题.
我能够组合2个列表:
%element
element(X,[X|_]).
element(X,[_|Y]):-
element(X,Y).
%union
union([],M,M).
union([X|Y],L,S) :- element(X,L),union(Y,L,S).
union([X|Y],L,[X|S]) :- (not(element(X,L))),union(Y,L,S).
Run Code Online (Sandbox Code Playgroud)
有人可以帮我吗?
术语fib(N,F)
当是真的F
是N
个Fibonacci数.
以下Prolog代码通常适用于我:
:-use_module(library(clpfd)).
fib(0,0).
fib(1,1).
fib(N,F) :-
N #> 1,
N #=< F + 1,
F #>= N - 1,
F #> 0,
N1 #= N - 1,
N2 #= N - 2,
F1 #=< F,
F2 #=< F,
F #= F1 + F2,
fib(N1,F1),
fib(N2,F2).
Run Code Online (Sandbox Code Playgroud)
执行此查询时(在SICStus Prolog中),找到第一个(并且正确)匹配N(而非立即):
| ?- fib(X,377).
X = 14 ?
Run Code Online (Sandbox Code Playgroud)
当进行(通过输入";")以查看是否还有其他匹配(根据定义是不可能的)时,需要花费大量时间(与第一次匹配相比),只是总是回答否:
| ?- fib(X,377).
X = 14 ? ;
no
Run Code Online (Sandbox Code Playgroud)
作为Prolog的新手,我尝试以!
各种方式使用Cut-Operator(),但是在第一场比赛后我找不到阻止搜索的方法.根据上述规则,它是否可能?如果是的话,请告诉我如何:)