序言:读取谓词在用户输入中省略了一些括号

时间:2019-02-05 14:55:13

标签: prolog

我是Prolog的新手。我正在尝试解决电路板尺寸和连接点起始端位置不同的数字链接难题。由于电路板的配置细节各不相同,因此我将从用户那里获得所有这些细节。为了获得用户输入,我在序言中使用read / 1谓词。但是,当我尝试再次写用户输入时,我发现缺少一些括号,这对我进一步处理很重要。以下是我正在使用的示例代码以及输入和输出。

number_link_puzzle(Input):-
read(Input),
write(Input).

这里的输入值为:7,5,(1:(5,2),(4,3)),(2:(3,2),(4,3))。
注意圆括号周围的(4,3)坐标。 但是当我写回用户输入时得到的输出是X =(7,5,(1:(5,2),4,3),2:(3,2),4,3)。

4,3中没有括号的地方。由于输入中的括号对于我在程序中的进一步处理很重要,因此我想知道为什么省略了该括号,或者还有其他替代方法可以用来完成此操作吗?

先谢谢了:)

1 个答案:

答案 0 :(得分:0)

建议1:强制用户编写有效的Prolog术语并从顶层运行该程序作为查询。看起来可能像这样:

?- number_link_puzzle(puzzle(7, 5, x(1, 5-2, 4-3), x(2, 3-2, 4-3))).

我不知道这是什么难题(因为您没有说),所以我不知道这是否是编写它的最佳方法。但是至少现在您可以在头部使用模式匹配来“提取”(或只是访问)所有值。谓词的头看起来像这样:

number_link_puzzle(puzzle(A, B, x(C, D-E, F-G), x(H, I-J, K-L)))

只需在此处放置一些工作代码,就让它在其中打印出所有变量:

number_link_puzzle(puzzle(A, B, x(C, D-E, F-G), x(H, I-J, K-L))) :-
    format("~w", [[A,B,C,D,E,F,G,H,I,J,K,L]]).

通过上面的查询,您将获得:

?- number_link_puzzle(puzzle(7, 5, x(1, 5-2, 4-3), x(2, 3-2, 4-3))).
[7,5,1,5,2,4,3,2,3,2,4,3]
true.

这是处理此类问题的简便方法:只需避免出现问题。建议2和3涉及不必要的工作,我不会编写完整的代码。

建议2:您可以使用read/1,但要更改其表示形式,使其成为有效的Prolog术语。不必要,因为这只是实施建议1的一种回旋方式。

建议3:使用类似read_line_to_codes的内容读取代码列表(或字符列表)的所有输入,然后使用DCG对其进行解析。这意味着您可以提出所需的任何表示形式,但是必须先对其进行解析以从中提取数据。

类似的东西:

puzzle(p(A, B, C, D)) -->
    number(A), ", ",
    number(B), ", ",
    x(C), ", ",
    x(D).

x(x(A, B-C, D-E)) -->
    "(", number(A), ": ",
    pair(B, C), ", ",
    pair(D, E), ")".

pair(A, B) --> "(", number(A), ",", number(B), ")".

如果您已添加并添加了SWI-Prolog,则此方法实际上将起作用

:- use_module(library(dcg/basics)).

在其顶部。

?- phrase(puzzle(P), `7, 5, (1: (5,2), (4,3)), (2: (3,2), (4,3))`).
P = p(7, 5, x(1, 5-2, 4-3), x(2, 3-2, 4-3)).