标签: prolog

Prolog:过滤清单?

我目前正在开发一个关于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],删除了所有元素显然,过滤器适用.

我在功能的基本结构方面遇到了麻烦,所以如果有人能为这样的功能提供一个基本的轮廓,那将会有很大的帮助.我尽可能地简化了我的情况,所以我可以拿出你能提供的任何东西,并根据我的需要进行修改.

提前致谢!

list prolog filter meta-predicate

16
推荐指数
2
解决办法
1万
查看次数

删除列表中的重复项(Prolog)

我是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给出了多个相同的解决方案.输入列表中的重复次数越多,解决方案就越多.我究竟做错了什么?提前致谢.

list prolog

15
推荐指数
4
解决办法
4万
查看次数

你能用Scala进行逻辑编程吗?

我在某处看到,Scala中匹配/案例功能支持的模式匹配实际上是从Prolog这样的逻辑语言中借用的.

您能否使用Scala优雅地解决连接图问题等问题?例如https://www.csupomona.edu/~jrfisher/www/prolog_tutorial/2_15.html

language-features programming-languages scala prolog logic-programming

15
推荐指数
5
解决办法
6511
查看次数

Prolog SAT解算器

我正在尝试构建一个简单的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)

boolean-logic prolog clpb

15
推荐指数
2
解决办法
4989
查看次数

Prolog中的感叹号

鉴于以下事实和谓词:

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

15
推荐指数
3
解决办法
2万
查看次数

如何从命令行运行SWI-Prolog?

有没有办法只创建一个这样的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)

shell executable command-line prolog swi-prolog

15
推荐指数
2
解决办法
1万
查看次数

Prolog - 红色切割和绿色切割之间的差异

我开始学习prolog,并希望让整个切割更加清晰.我已经读到"绿色切割不会改变程序的声明性含义,而红切不会".但是,程序的意义并不是真正纯粹的声明(仅仅是因为prolog实际上是为所有选项回溯).

这是一个例子:

p(1).
p(2) :- !.
p(3).
Run Code Online (Sandbox Code Playgroud)

据说这是绿色切割.但如果我运行这个:

p(X), X =:= 3.
Run Code Online (Sandbox Code Playgroud)

我会在没有剪辑的情况下获得"真实",并且在剪切时获得"假".所以,我错过了什么?

提前致谢.

prolog prolog-cut

15
推荐指数
1
解决办法
7638
查看次数

使用not设置Intersection谓词Prolog

我正在尝试构建一个简单的谓词,它将两个列表作为输入,结果是由前两个列表的交集组成的第三个.我决定使用逻辑陈述.我很确定我的逻辑是正确的,但我的谓词不起作用.有任何想法吗?:

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.

prolog

15
推荐指数
3
解决办法
707
查看次数

swipl:如何重新加载文件

首先我加载文件 SWI-Prolog

$ swipl file.pl
Run Code Online (Sandbox Code Playgroud)

然后我修改文件并保存.

现在我如何重新加载文件

?- reload
Run Code Online (Sandbox Code Playgroud)

为此修改file.pl

prolog swi-prolog

15
推荐指数
1
解决办法
6643
查看次数

在查询中使用冗余目标

(根据@repeat建议)考虑一个程序的查询1 ?- G_0.如果有的话,这个查询?- G_0, G_0.有什么用?

脚注
1 没有表格(为了安全),约束是可以的。
上一篇关于这个主题的帖子

prolog logical-purity

15
推荐指数
1
解决办法
354
查看次数