相关疑难解决方法(0)

字符串列表的最长公共前缀(LCP)

lcs([ H|L1],[ H|L2],[H|Lcs]) :-
    !,
    lcs(L1,L2,Lcs).
lcs([H1|L1],[H2|L2],Lcs):-
    lcs(    L1 ,[H2|L2],Lcs1),
    lcs([H1|L1],    L2 ,Lcs2),
    longest(Lcs1,Lcs2,Lcs),
    !.
lcs(_,_,[]).

longest(L1,L2,Longest) :-
    length(L1,Length1),
    length(L2,Length2),
    (  Length1 > Length2
    -> Longest = L1
    ;  Longest = L2
    ).
Run Code Online (Sandbox Code Playgroud)

到目前为止这是我的代码.我怎样才能优化它以便打印前缀,例如:

["interview", "interrupt", "integrate", "intermediate"]
Run Code Online (Sandbox Code Playgroud)

应该回来 "inte"

Prolog有点生疏,有一段时间没做过:)

list prolog prolog-cut prolog-dif logical-purity

19
推荐指数
4
解决办法
1184
查看次数

Prolog解包列出谓词

嘿伙计,所以我试图创造一些像这样的工作:

?- unpacking([[1], [1,2], [3]], Lst1, NewLst).
NewLst=[1,3]
Run Code Online (Sandbox Code Playgroud)

我这样写的:

unpacking([], Lst1, Lst1).
unpacking([[H]|T], Lst1, NewLst):-
    append([H], Lst2),
    unpacking(T, Lst2, NewLst).
unpacking([_|T], Lst1, NewLst):-
    unpacking(T, Lst1, NewLst).
Run Code Online (Sandbox Code Playgroud)

我知道我做错了什么,但是,我是在Prolog开始所以,需要从我的错误中吸取教训:)

prolog

11
推荐指数
4
解决办法
551
查看次数

Prolog DCG的问题

该项目是关于将半自然语言翻译成SQL表格.代码:

label(S) --> label_h(C), {atom_codes(A, C), string_to_atom(S, A)}, !.

label_h([C|D]) --> letter(C), letters_or_digits(D), !.

letters_or_digits([C|D]) --> letter_or_digit(C), letters_or_digits(D), !.
letters_or_digits([C]) --> letter_or_digit(C), !.
letters_or_digits([]) --> "", !.

letter(C) --> [C], {"a"=<C, C=<"z"}, !.
letter(C) --> [C], {"A"=<C, C=<"Z"}, !.
letter_or_digit(C) --> [C], {"a"=<C, C=<"z"}, !.
letter_or_digit(C) --> [C], {"A"=<C, C=<"Z"}, !.
letter_or_digit(C) --> [C], {"0"=<C, C=<"9"}, !.

table("student").

sbvr2sql --> label(Name), " is an integer.", {assert(fields(Name, "INT"))}.
sbvr2sql --> label(Name), " is a string.", {assert(fields(Name, "VARCHAR(64)"))}.

sbvr2sql(Table, Property)  --> label(Table), …
Run Code Online (Sandbox Code Playgroud)

grammar nlp prolog dcg

7
推荐指数
1
解决办法
378
查看次数

SWI-Prolog如何显示整个答案(列表)?

我正在尝试将字符串转换为ascii代码列表,如下所示:

7 ?- string_to_list("I'm a big blue banana in space!", C).
C = [73, 39, 109, 32, 97, 32, 98, 105, 103|...].

8 ?- 
Run Code Online (Sandbox Code Playgroud)

如你所见,这并没有给我整个列表,但我需要它.

这个解决方案不起作用:我不能按w,因为它给了我答案并完全停止.这也不是:我可以调用该函数,它返回true,但列表仍未完全显示.

11 ?- set_prolog_flag(toplevel_print_options,[quoted(true), portray(true), max_depth(0), spacing(next_argument)]).
true.

12 ?- string_to_list("I'm a big blue banana in space!", C).
C = [73, 39, 109, 32, 97, 32, 98, 105, 103|...].

13 ?- 
Run Code Online (Sandbox Code Playgroud)

任何帮助赞赏!

prolog swi-prolog prolog-toplevel

7
推荐指数
1
解决办法
5281
查看次数

Prolog得到字符串的头尾

我正试图将我的大脑第一次包裹在Prolog(SWI-Prolog),我正在努力克服我确定的基础知识.我正试图拿一个像"馅饼"这样的字符串并打印出军事北约拼写它看起来像这样:

spellWord("Pie").
Papa
India
Echo
Run Code Online (Sandbox Code Playgroud)

目前我只是想验证我正在使用[H | T]语法和Write函数.我的功能是:

spellWord(String) :- String = [H|T], writeChar(H), spellWord(T).

writeChar(String) :- H == "P", print4("Papa").
Run Code Online (Sandbox Code Playgroud)

打电话时spellWord("Pie").这当前只返回false.

string list prolog dcg

7
推荐指数
2
解决办法
1461
查看次数

prolog将数字转换为罗马数字

我有这个代码将整数转换为罗马数字我需要添加一个函数,将整数与罗马数字输入进行比较,并显示它是否为try或false,例如:roman(v,5).真正

toroman(0).
toroman(N) :- N < 4, put("I"), M is N - 1, toroman(M).
toroman(N) :- N = 4, put("I"), put("V").
toroman(N) :- N = 5, put("V").
toroman(N) :- N < 9, put("V"), M is N - 5, toroman(M).
toroman(N) :- N = 9, put("I"), put("X").
toroman(N) :- N < 40, put("X"), M is N - 10, toroman(M).
toroman(N) :- N < 50, put("X"), put("L"), M is N - 40, toroman(M).
toroman(N) :- N < 90, put("L"), M is N …
Run Code Online (Sandbox Code Playgroud)

numbers prolog roman-numerals dcg clpfd

6
推荐指数
2
解决办法
1308
查看次数

Prolog - 字符串或字符的字符代码列表

我在prolog中有一个字符代码列表.

我想把它们改成字符.

例如,

L = "abc" 回报 L = [97,98,99]

假设我开始 L = [97,98,99]

无论如何将L转换回abc,如果存在方法

convert(L, X) 回报 X = abc

谢谢.

list character prolog character-encoding

6
推荐指数
1
解决办法
9942
查看次数

如何在Prolog中创建此DCG?

我想创建一个像这样的语言被接受的DCG:

  • C
  • bbbcbbb
  • bbacbba
  • abacaba
  • aababacaababa

正如您所看到的,这意味着a和b的特定顺序,然后是c,然后再次与c之前的顺序完全相同.如果不满足这些条件,它将失败.

我目前在这里采用我的方法(工作,但也识别错误的单词)

s --> x, s, x. 
s --> [c]. 
x --> [a]. 
x --> [b]. 
Run Code Online (Sandbox Code Playgroud)

你们有人可以帮我解决我需要改变的问题吗?我不知道该怎么做.非常感谢.

prolog regular-language dcg

6
推荐指数
2
解决办法
175
查看次数

应该编写文本处理 DCG 来处理代码还是字符?或两者?

在 Prolog 中,传统上有两种表示字符序列的方法:

  • 作为字符列表,它们是长度为 1 的原子。
  • 作为代码列表,它们只是整数。整数将被解释为代码点,但未指定要应用的约定。作为一个(非常理智的)例子,在 SWI-Prolog 中,代码点的空间是Unicode(因此,大致上,代码点整数范围从 0 到 0x10FFFF)。

DCG 是一种编写从左到右列表处理代码的符号方式,旨在对“分解文本列表”进行解析。根据偏好,待处理的列表可以是字符列表或代码列表。但是,在写下常量时,字符/代码处理的表示法有所不同。通常以“字符样式”或“代码样式”编写 DCG 吗?或者甚至在模块导出 DCG 非终端的情况下采用字符/代码样式以实现可移植性?

有些研究

以下符号可用于表示 DCG 中的常数

  • 'a': 一个字符(像往常一样:单引号表示一个原子,如果标记以小写字母开头,它们可以被省略。)
  • 0'a:该代码a
  • ['a','b']: 一个字符列表。
  • [ 0'a, 0'b ]:列表,即编码ab(这样就可以避免在实际的代码点值打字)。
  • "a"代码列表。传统上,双引号字符串被分解为代码列表,这种表示法在 DCG 上下文中也适用于 SWI-Prolog,即使 SWI-Prolog 将“双引号字符串”映射到特殊的字符串数据类型。
  • `0123`. 传统上,反引号内的文本被映射到一个原子(我认为,95 ISO 标准只是避免对反引号字符串的含义进行具体说明。“这将是 ISO/IEC 13211 的这一部分的有效扩展到将反引号字符串定义为表示字符串常量。" )。在 SWI-Prolog 中,反引号内的文本被分解为代码 …

prolog dcg

6
推荐指数
1
解决办法
208
查看次数

漂亮打印一个序言

如何在SWI-Prolog中打印一个术语列表.

我试过了:

portray_clause([term1, term2]).

但是这只是在一个长流中写出来,一个字符串甚至作为一个ascii字符代码列表出现 - 我想要打印"abc".

pretty-print prolog

5
推荐指数
0
解决办法
1248
查看次数