我目前正在开发一个关于Prolog的非常短的项目,并且试图将我创建的"过滤器"应用到列表中.我有你可以称之为过滤器的东西,但我无法应用它.如果我说明一下会更好:
filter(A, B)
Run Code Online (Sandbox Code Playgroud)
...如果满足某些条件,则输出'true'.
filterList(A, [X, Y, Z])
Run Code Online (Sandbox Code Playgroud)
...输出一个列表,其中包含第二个参数中使过滤器输出为false的所有元素.(因此,如果过滤器(A,X)为真,则输出为[Y,Z]).
我已准备好"过滤器"功能,但现在我需要将它应用于第二个示例中所示的列表,排除在应用第一个参数时过滤器返回true的所有元素.
因此,如果过滤器是简单的A == B,则该函数应该接收A [A,B,A,C,D,A]并输出[B,C,D],删除了所有元素显然,过滤器适用.
我在功能的基本结构方面遇到了麻烦,所以如果有人能为这样的功能提供一个基本的轮廓,那将会有很大的帮助.我尽可能地简化了我的情况,所以我可以拿出你能提供的任何东西,并根据我的需要进行修改.
提前致谢!
我是Prolog的新手,并尝试了一些练习.其中之一是:
编写一个谓词集(InList,OutList),它将任意列表作为输入,并返回一个列表,其中输入列表的每个元素只出现一次.
这是我的解决方案:
member(X,[X|_]).
member(X,[_|T]) :- member(X,T).
set([],[]).
set([H|T],[H|Out]) :-
not(member(H,T)),
set(T,Out).
set([H|T],Out) :-
member(H,T),
set(T,Out).
Run Code Online (Sandbox Code Playgroud)
我不允许使用任何内置谓词(即使不使用也会更好not/1
).问题是,这set/2
给出了多个相同的解决方案.输入列表中的重复次数越多,解决方案就越多.我究竟做错了什么?提前致谢.
我在某处看到,Scala中匹配/案例功能支持的模式匹配实际上是从Prolog这样的逻辑语言中借用的.
您能否使用Scala优雅地解决连接图问题等问题?例如https://www.csupomona.edu/~jrfisher/www/prolog_tutorial/2_15.html
language-features programming-languages scala prolog logic-programming
我正在尝试构建一个简单的Prolog SAT求解器.我的想法是用户应该使用Prolog列表输入要在CNF(Conjuctive Normal Form)中解决的布尔公式,例如(A或B)和(B或C)应该表示为sat([[A,B]] ,[B,C]])和Prolog试图找到A,B,C的值.
我的以下代码不起作用,我不明白为什么.在这一行跟踪调用:(7)sat([[true,true]])? 我期待start_solve_clause([_ G609,_G612]]).
免责声明:对不起几天前我甚至不知道Prolog或SAT问题的糟糕代码.
PS:欢迎提出解决SAT问题的建议.
跟踪
sat([[X, Y, Z], [X, Y]]).
Call: (6) sat([[_G609, _G612, _G615], [_G609, _G612]]) ? creep
Call: (7) start_solve_clause([_G609, _G612, _G615]) ? creep
Call: (8) solve_clause([_G615], _G726) ? creep
Call: (9) or(_G725, _G615, true) ? creep
Exit: (9) or(true, true, true) ? creep
Exit: (8) solve_clause([true], true) ? creep
Call: (8) or(_G609, _G612, true) ? creep
Exit: (8) or(true, true, true) ? creep
Exit: (7) start_solve_clause([true, …
Run Code Online (Sandbox Code Playgroud) 鉴于以下事实和谓词:
sound(time1).
sound(time2).
sun(time3).
relax(X):-sound(X),!,sun(X).
relax(_):-sun(_).
Run Code Online (Sandbox Code Playgroud)
执行时,relax(S).
我希望得到S=time1
这个!
,那说(如果我错了就纠正我),如果'X'满足,那么停止回溯.
这是跟踪:
3 ?- trace.
true.
[trace] 3 ?- relax(S).
Call: (6) relax(_G1831) ? creep
Call: (7) sound(_G1831) ? creep
Exit: (7) sound(time1) ? creep
Call: (7) sun(time1) ? creep
Fail: (7) sun(time1) ? creep
Fail: (6) relax(_G1831) ? creep
false.
Run Code Online (Sandbox Code Playgroud)
那么为什么Prolog也会检查sun(time1)
,即使它在满足之后遇到感叹号sound(X)
(因为这sound(time1)
是事实).
有没有办法只创建一个这样的prolog脚本hello.pl
:
#!/usr/local/bin/swipl -q -s -t main
main:-
write('Hello World\n').
Run Code Online (Sandbox Code Playgroud)
能够像这样从终端运行吗?
$ hello.pl
Hello World
$
Run Code Online (Sandbox Code Playgroud)
当我这样做时它给了我这个:
hello.pl: line 3: main:-: command not found
hello.pl: line 4: syntax error near unexpected token `'Hello World\n''
hello.pl: line 4: ` write('Hello World\n').'
Run Code Online (Sandbox Code Playgroud)
我可以通过在命令行上写这个来使它工作:
$ swipl -q -f hello.pl -t main
Hello World
$
Run Code Online (Sandbox Code Playgroud)
但有没有办法将直接脚本作为可执行文件运行?
编辑
还没有能够让这个工作.以下是@Boris在其答案评论中提出的命令的输出:
$ ls -l
total 8
-rwxr-xr-x 1 viatropos staff 235 Aug 26 20:28 example.pl
$ cat example.pl
#!/usr/local/bin/swipl
:- set_prolog_flag(verbose, silent).
:- initialization main.
main …
Run Code Online (Sandbox Code Playgroud) 我开始学习prolog,并希望让整个切割更加清晰.我已经读到"绿色切割不会改变程序的声明性含义,而红切不会".但是,程序的意义并不是真正纯粹的声明(仅仅是因为prolog实际上是为所有选项回溯).
这是一个例子:
p(1).
p(2) :- !.
p(3).
Run Code Online (Sandbox Code Playgroud)
据说这是绿色切割.但如果我运行这个:
p(X), X =:= 3.
Run Code Online (Sandbox Code Playgroud)
我会在没有剪辑的情况下获得"真实",并且在剪切时获得"假".所以,我错过了什么?
提前致谢.
我正在尝试构建一个简单的谓词,它将两个列表作为输入,结果是由前两个列表的交集组成的第三个.我决定使用逻辑陈述.我很确定我的逻辑是正确的,但我的谓词不起作用.有任何想法吗?:
element(X,[H|T]) :-
X=H
;
element(X,T).
intersection(L1,L2,R) :-
not((
element(A,L1),
not(element(A,L2))
)),
not((
element(A,L1),
not(element(A,R))
)).
Run Code Online (Sandbox Code Playgroud)
请不要发布替代方法我想知道为什么每次都返回FALSE.
首先我加载文件 SWI-Prolog
$ swipl file.pl
Run Code Online (Sandbox Code Playgroud)
然后我修改文件并保存.
现在我如何重新加载文件
?- reload
Run Code Online (Sandbox Code Playgroud)
为此修改file.pl
?
prolog ×10
list ×2
swi-prolog ×2
clpb ×1
command-line ×1
executable ×1
filter ×1
prolog-cut ×1
scala ×1
shell ×1