我正在Prolog中编写一个谓词,将列表分成两个相等长度的列表.例如 :
div([1,2,3,4] , X , Y).
X = [1,2].
Y = [3,4].
Run Code Online (Sandbox Code Playgroud)
这是我的代码,但它不起作用:
div(L , L1 , L):- length(L) == length(L1).
div([ H | T ] , [ H | T1] , L2):- div(T , T1 , L2).
Run Code Online (Sandbox Code Playgroud) 嗨,我正在研究一个Prolog项目,我需要读取整个文件.我有一个名为'meno.txt'的文件,我需要阅读它.我在堆栈上找到了一些代码.代码如下:
main :-
open('meno.txt', read, Str),
read_file(Str,Lines),
close(Str),
write(Lines), nl.
read_file(Stream,[]) :-
at_end_of_stream(Stream).
read_file(Stream,[X|L]) :-
\+ at_end_of_stream(Stream),
read(Stream,X),
read_file(Stream,L).
Run Code Online (Sandbox Code Playgroud)
当我调用main/0谓词时,我收到一个错误,指出文件意外结束.我的文件看起来像这样:
line1
line2
line3
line4
Run Code Online (Sandbox Code Playgroud)
我在这里也发现了类似的问题以及ASCII和UTF编码的解决方案,但我尝试过,看起来它不是我的解决方案.有人可以帮忙吗?
我正在寻找适用于 Mac OS X 的 SWI-Prolog 编辑器,但我找不到,那么有没有或者我必须使用另一个编辑器来构建 Prolog 文件?
谢谢
例如,我有一些代表数字 1 到 4 的原子。
喜欢
number(one).
number(two).
number(three).
number(four).
Run Code Online (Sandbox Code Playgroud)
现在我必须编写一个谓词来检查第一个数字是否大于第二个数字。
istBiggerThen(X,Y) :-
( X < Y
-> true
; false
).
Run Code Online (Sandbox Code Playgroud)
但现在我只能问诸如此类
isBiggerThan(3,4).
Run Code Online (Sandbox Code Playgroud)
但是我要
isBiggerThan(three,four).
Run Code Online (Sandbox Code Playgroud)
我怎样才能做到这一点?请帮助我:) 提前致谢。
遇到这个任务有些麻烦.
目前我已经尝试了这个,我知道这是错误的,因为我不确定如何将L分为头部和尾部,但这是我想要的那种想法.
second(L,E) :- [H | E | T]
Run Code Online (Sandbox Code Playgroud)
我认为E必须在头部之后才能成为第二个元素.不过我是这门语言的新手,想要一些见解.如何从谓词的编写方式中获得这个头和尾.对此问题的一些见解将非常感激.谢谢.
我是prolog的新手,我正在尝试编写一个谓词,以便我可以判断一个列表是否是一个大小的列表.目前我有这个:
one([H | T]) :- H \= [] ,T == [].
Run Code Online (Sandbox Code Playgroud)
这有问题,至少我的逻辑是,如果H它不是空的并且尾部没有任何东西,则必须是头部中存在某些东西并因此具有一个大小的情况.否则它没有.
非常感谢您解决此问题的一些见解.
我正在努力理解Prolog中的递归,但它肯定与其他语言中的递归不同(我使用PHP,Java和C,只是说).
所以,是的,我一直在阅读有关它的所有教程,但我仍然没有得到具体的,相当复杂的案例.
例如,为了获得列表中元素的出现次数,我们有:
occurrence([], _, 0).
occurrence([H | T], H, N) :- !, occurrence(T, H, N1), N is N1 + 1.
occurrence([_ | T], H, N) :- occurrence(T, H, N).
Run Code Online (Sandbox Code Playgroud)
可以使用以下方式调用:
occurrence([1,4,9,1,2],1,R).
Run Code Online (Sandbox Code Playgroud)
它应该导致:
?- R=2
Run Code Online (Sandbox Code Playgroud)
现在,为什么第3行甚至会发生?它在做什么?我写了这个程序而没有看到答案,我在第二行之后完成了.当然,它不会工作.
另一方面,为什么在那里发生"切割"?比如,我一直试图在每次通话后打印出结果,我只是越来越困惑.